Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

Joburgess 5 lat temu
rodzic
commit
702df724b8

+ 1 - 1
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ResourceServerConfig.java

@@ -26,7 +26,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/task/**","/v2/api-docs","/code/*","/user/updatePassword","/user/noAuth/queryUserByPhone").hasIpAddress("0.0.0.0/0").anyRequest().authenticated().and().httpBasic();
+				.authorizeRequests().antMatchers("/task/**","/v2/api-docs","/code/*","/user/updatePassword","/user/noAuth/queryUserByPhone","/user/queryUserById/*").hasIpAddress("0.0.0.0/0").anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 9 - 2
edu-im/edu-im-server/src/main/java/com/keao/edu/im/controller/RoomController.java

@@ -33,7 +33,7 @@ public class RoomController{
     @RequestMapping(value = "/join", method = RequestMethod.POST)
     public BaseResponse joinRoom(@RequestBody ReqUserData data)
             throws Exception {
-        return roomService.joinRoom(data.getRegistrationId(), data.isAudience(), data.isDisableCamera(),data.isMusicMode(),data.getRoomId());
+        return roomService.joinRoom(data.getRegistrationId(), data.isDisableCamera(),data.getRoomId());
     }
 
     @RequestMapping(value = "/joinGroup", method = RequestMethod.POST)
@@ -61,11 +61,18 @@ public class RoomController{
         return new BaseResponse<>(result);
     }
 
+    @RequestMapping(value = "/joinFailure", method = RequestMethod.POST)
+    public Object joinFailure(String roomId,String userId)
+            throws Exception {
+        roomService.joinFailure(roomId,userId);
+        return new BaseResponse<>();
+    }
+
     @RequestMapping(value = "/statusSync")
     public Object statusSync(@RequestBody String body) throws Exception {
         ChannelStateNotify notify = JSONObject.parseObject(body, ChannelStateNotify.class);
         log.info("statusSyncParam: {}",JSONObject.toJSON(notify));
-        boolean b = roomService.statusSync(notify);
+        roomService.statusSync(notify);
         return new BaseResponse<>();
     }
 

+ 92 - 102
edu-im/edu-im-server/src/main/java/com/keao/edu/im/mec/im/IMHelper.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
 import java.net.HttpURLConnection;
 import java.net.URLEncoder;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Created by weiqinxiao on 2019/2/28.
@@ -237,68 +238,38 @@ public class IMHelper {
      * @throws Exception
      */
     @Async
-    public IMApiResultInfo startRecord(String hostUserId, String roomId, Long registrationId, List<RoomMember> roomMembers) throws Exception {
+    public IMApiResultInfo startRecord(String roomId, Long registrationId, List<RoomMember> roomMembers) throws Exception {
         if (roomId == null) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("mode",3);
-        jsonObject.put("videoFormat","mp4");
-        jsonObject.put("audioFormat","aac");
-        jsonObject.put("videoResolution","640x480");
-        jsonObject.put("mixLayout",2);
-        jsonObject.put("sliceMin",30);
-//        jsonObject.put("renderMode",1);
-        jsonObject.put("hostUserId",hostUserId);
-        jsonObject.put("hostStreamId",hostUserId);
-        JSONObject json = new JSONObject();
+        if (roomMembers == null || roomMembers.size() == 0) {
+            throw new IllegalArgumentException("Paramer 'roomMembers' is can not be null");
+        }
+        JSONObject paramJson = new JSONObject();
+
         String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
         if(StringUtils.isEmpty(sessionId)){
             sessionId = roomQuery(roomId);
             redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
         }
-        json.put("sessionId",sessionId);
-        json.put("config",jsonObject);
-
-        /*JSONObject jsonObject = new JSONObject();
-        jsonObject.put("mode",3);
-        jsonObject.put("videoFormat","mp4");
-        jsonObject.put("audioFormat","mp3");
-        jsonObject.put("videoResolution","640x480");
-        jsonObject.put("mixLayout",2);
-        jsonObject.put("sliceMin",30);
-        jsonObject.put("renderMode",1);
-        jsonObject.put("hostUserId","");
-        jsonObject.put("hostStreamId","");
-
-        JSONObject json = new JSONObject();
-        JSONArray jsonArray = new JSONArray();
-        boolean isMaster = true;
-        for (int i = 0; i < roomMembers.size(); i++) {
-            RoomMember roomMember = roomMembers.get(i);
-            JSONObject jsonObject1 = new JSONObject();
-            jsonObject1.put("userId",roomMember.getUid());
-            jsonObject1.put("streamId",roomMember.getUid());
-            if((roomMember.getRole() == 3 && isMaster) || (i == roomMembers.size() - 1 && isMaster)){
-                jsonObject1.put("x",0);
-                jsonObject1.put("y",0);
-                jsonObject1.put("width",0.5);
-                jsonObject1.put("height",0.5);
-                isMaster = false;
-            }else {
-                jsonObject1.put("x",0.5);
-                jsonObject1.put("y",0.5);
-                jsonObject1.put("width",0.5);
-                jsonObject1.put("height",0.5);
-            }
-            jsonArray.add(jsonObject1);
-        }
-        JSONObject jsonObject1 = new JSONObject();
-        jsonObject1.put("video",jsonArray);
-        jsonObject.put("input",jsonObject1);*/
-        String body = json.toJSONString();
+        paramJson.put("sessionId",sessionId);
+//        paramJson.put("sessionId",roomQuery(roomId));
+
+        JSONObject config = new JSONObject();
+        config.put("mode",3);
+        config.put("videoFormat","mp4");
+        config.put("audioFormat","aac");
+        config.put("videoResolution","640x480");
+        config.put("mixLayout",1);
+        config.put("sliceMin",30);
+        config.put("renderMode",1);
+        config.put("hostUserId","");
+        config.put("hostStreamId","");
+
+        config.put("input",getInput(roomMembers));
+        paramJson.put("config",config);
+        String body = paramJson.toJSONString();
 
-        Thread.sleep(1000l);
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/start.json", "application/json",roomId);
         httpHelper.setBodyParameter(body, conn);
         IMApiResultInfo resultInfo = JSON.parseObject(httpHelper.returnResult(conn, body), IMApiResultInfo.class);
@@ -322,40 +293,24 @@ public class IMHelper {
         if (roomId == null) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("mixLayout",1);
-        jsonObject.put("renderMode",1);
-        jsonObject.put("hostUserId","");
-        jsonObject.put("hostStreamId","");
-        JSONObject json = new JSONObject();
-        json.put("sessionId",roomQuery(roomId));
-        json.put("config",jsonObject);
-        JSONArray jsonArray = new JSONArray();
-        boolean isMaster = true;
-        for (int i = 0; i < roomMembers.size(); i++) {
-            RoomMember roomMember = roomMembers.get(i);
-            JSONObject jsonObject1 = new JSONObject();
-            jsonObject1.put("userId",roomMember.getUid());
-            jsonObject1.put("streamId",roomMember.getUid());
-            if((roomMember.getRole() == 3 && isMaster) || (i == roomMembers.size() - 1 && isMaster)){
-                jsonObject1.put("x",0);
-                jsonObject1.put("y",0);
-                jsonObject1.put("width",0.5);
-                jsonObject1.put("height",0.5);
-                isMaster = false;
-            }else {
-                jsonObject1.put("x",0.5);
-                jsonObject1.put("y",0.5);
-                jsonObject1.put("width",0.5);
-                jsonObject1.put("height",0.5);
-            }
-            jsonArray.add(jsonObject1);
+        if (roomMembers == null || roomMembers.size() == 0) {
+            throw new IllegalArgumentException("Paramer 'roomMembers' is can not be null");
         }
-        JSONObject jsonObject1 = new JSONObject();
-        jsonObject1.put("video",jsonArray);
-        json.put("input",jsonObject1);
+        JSONObject paramJson = new JSONObject();
+        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
+        if(StringUtils.isEmpty(sessionId)){
+            sessionId = roomQuery(roomId);
+            redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
+        }
+        paramJson.put("sessionId",sessionId);
+//        paramJson.put("sessionId",roomQuery(roomId));
+        paramJson.put("mixLayout",1);
+        paramJson.put("renderMode",1);
+        paramJson.put("hostUserId","");
+        paramJson.put("hostStreamId","");
 
-        String body = json.toJSONString();
+        paramJson.put("input",getInput(roomMembers));
+        String body = paramJson.toJSONString();
 
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/config.json", "application/json",roomId);
         httpHelper.setBodyParameter(body, conn);
@@ -363,33 +318,68 @@ public class IMHelper {
         return resultInfo;
     }
 
+    private JSONObject getInput(List<RoomMember> roomMembers){
+        JSONArray videos = new JSONArray();
+        boolean isMaster = true;
+
+        int size = roomMembers.size();
+        float x = -0.2f;
+        int num = 1;
+        for (int i = 0; i < size; i++) {
+            RoomMember roomMember = roomMembers.get(i);
+            JSONObject video = new JSONObject();
+            video.put("userId",roomMember.getUid());
+            video.put("streamId",roomMember.getUid() + "_RongCloudRTC");
+            if((roomMember.getRole() == 3 && isMaster) || (i == size - 1 && isMaster) || (i == 5 && isMaster)){
+                video.put("x",0);
+                video.put("y",0);
+                if(size == 1){
+                    video.put("width",1);
+                    video.put("height",1);
+                }else {
+                    video.put("width",1);
+                    video.put("height",0.8);
+                }
+                isMaster = false;
+            }else {
+                video.put("width",0.2);
+                video.put("height",0.2);
+                if(num <= 5){
+                    x = x + 0.2f;
+                    video.put("x",x);
+                    video.put("y",0.8);
+                }else {
+                    break;
+                }
+                num++;
+            }
+            videos.add(video);
+        }
+        JSONObject input = new JSONObject();
+        input.put("video",videos);
+        return input;
+    }
+
     /**
      * 结束录制
      * @param roomId
      * @return
      * @throws Exception
      */
-    public IMApiResultInfo stopRecord(String hostUserId, String roomId) throws Exception {
+    public IMApiResultInfo stopRecord(String roomId) throws Exception {
         if (roomId == null) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
+        JSONObject paramJson = new JSONObject();
+        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
+        if(StringUtils.isEmpty(sessionId)){
+            sessionId = roomQuery(roomId);
+            redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
+        }
+        paramJson.put("sessionId",sessionId);
+//        paramJson.put("sessionId",roomQuery(roomId));
 
-//        if (hostUserId == null) {
-//            throw new IllegalArgumentException("Paramer 'groupId' is required");
-//        }
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("mode",3);
-        jsonObject.put("videoFormat","mp4");
-        jsonObject.put("audioFormat","aac");
-        jsonObject.put("videoResolution","640x480");
-        jsonObject.put("mixLayout",2);
-        jsonObject.put("sliceMin",30);
-        jsonObject.put("hostUserId",hostUserId);
-        JSONObject json = new JSONObject();
-        json.put("sessionId",roomQuery(roomId));
-        json.put("config",jsonObject);
-
-        String body = json.toJSONString();
+        String body = paramJson.toJSONString();
 
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/stop.json", "application/json",roomId);
         httpHelper.setBodyParameter(body, conn);

+ 122 - 105
edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/Impl/RoomServiceImpl.java

@@ -70,44 +70,17 @@ public class RoomServiceImpl implements RoomService {
     @Autowired
     private RedisTemplate<String,String> redisTemplate;
 
-    @Override
-    public void roomQuery(String roomId) throws Exception {
-        imHelper.roomQuery(roomId);
-    }
-
-    @Override
-    public void configRecord(String roomId) throws Exception {
-        List<RoomMember> roomMembers = roomMemberDao.findByRid(roomId);
-        if(roomMembers.size() > 0){
-            imHelper.configRecord(roomId,roomMembers);
-        }
-    }
-
-    @Override
-    public void startRecord(String roomId,String userId,String extra) throws Exception {
-        List<RoomMember> roomMembers = roomMemberDao.findByRid(roomId);
-        imHelper.startRecord(userId,roomId,null,roomMembers);
-    }
-
-    @Override
-    public void stopRecord(String userId,String roomId) throws Exception {
-//        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        imHelper.stopRecord(userId,roomId);
-    }
-
     private BaseResponse getBaseResponse(BaseResponse baseResponse){
         baseResponse.setErrCode(500);
         return baseResponse;
     }
 
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    @Override
-    public BaseResponse joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera, boolean isMusicMode, String roomId) throws ApiException, Exception {
+    public void joinRoomSuccess(Long registrationId,String roomId,String userId) throws Exception {
         StudentExamResultApiDto examResult = null;
-        log.info("joinRoom: roomId={}, isAudience={}, isDisableCamera={},isMusicMode={}", roomId, isAudience, isDisableCamera,isMusicMode);
+        log.info("joinRoomSuccess: roomId={}, isAudience={}, isDisableCamera={},isMusicMode={}", roomId);
 
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        String userId = sysUser.getId().toString();
+        SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(userId));
         String realName = sysUser.getRealName();
         if(registrationId != null){
             examResult = eduUserFeignService.getExamResult(registrationId);
@@ -116,7 +89,12 @@ public class RoomServiceImpl implements RoomService {
             if(byRidAndRole != null && byRidAndRole.size() > 0){
                 log.info("学员加入时,将其他学员退出房间 byRidAndRole{}",byRidAndRole);
                 for (RoomMember e: byRidAndRole) {
-                    leaveRoom(e.getExamRegistrationId(),roomId,userId);
+                    roomMemberDao.deleteUserByRidAndUid(roomId, e.getUid());
+                    MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, 3);
+                    msg.setUserName(e.getName());
+                    userDao.deleteByUid(userId);
+                    imHelper.publishMessage(userId, roomId, msg);
+//                    leaveRoom(e.getExamRegistrationId(),roomId,userId);
                 }
             }
         }
@@ -137,6 +115,84 @@ public class RoomServiceImpl implements RoomService {
             saveRoom(roomId, roomId, curTime, null);
         }
         RoleEnum roleEnum;
+        RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
+        if (roomMember == null) {
+            if(sysUser.getId().equals(examRoom.getMainTeacherUserId())){
+                roleEnum = RoleEnum.MainTeacher;
+            }else if(isAssistant){
+                roleEnum = RoleEnum.AssistantTeacher;
+            }else {
+                roleEnum = Student;
+            }
+            saveRoomMember(userId,sysUser.getAvatar(), realName, roomId, roleEnum.getValue(),true, curTime,registrationId);
+        } else {
+            roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
+        }
+        log.info("user exist in the room: roomId={} , userId={}, use the last role={}", roomId, userId, roleEnum);
+        MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
+        msg.setTimestamp(curTime);
+        msg.setUserName(realName);
+        msg.setCamera(true);
+        imHelper.publishMessage(userId, roomId, msg);
+
+        List<UserInfo> userInfoList = userDao.findByUid(userId);
+        if (userInfoList.isEmpty()) {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setUid(userId);
+            userInfo.setName(realName);
+            userInfo.setCreateDt(curTime);
+            userInfo.setUpdateDt(curTime);
+            userDao.save(userInfo);
+        } else {
+            UserInfo user = userInfoList.get(0);
+            user.setUpdateDt(curTime);
+            userDao.save(user);
+        }
+        List<RoomMember> roomMembers = roomMemberDao.findByRid(roomId);
+        log.info("join success: roomId = {}, userId = {}, userName={}, role = {}", roomId, userId, roleEnum);
+        if(registrationId != null){
+            if(examResult.getIsFinishedExam() == 1){
+                eduUserFeignService.updateFinishedExam(registrationId,0);
+            }
+            this.publishMessage(eduUserFeignService.getPublishMessage(registrationId));
+            eduUserFeignService.upsetStudentAttendance(registrationId,0);
+            imHelper.startRecord(roomId, registrationId,roomMembers);
+        }else {
+            eduUserFeignService.upsetTeacherAttendance(examRoom.getId(),sysUser.getId(),0);
+            imHelper.configRecord(roomId,roomMembers);
+        }
+    }
+
+    @Override
+    public BaseResponse joinRoom(Long registrationId,boolean isDisableCamera, String roomId){
+        StudentExamResultApiDto examResult = null;
+        log.info("joinRoom: roomId={}, isAudience={}, isDisableCamera={},isMusicMode={}", roomId,isDisableCamera);
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        String userId = sysUser.getId().toString();
+        String realName = sysUser.getRealName();
+        if(registrationId != null){
+            examResult = eduUserFeignService.getExamResult(registrationId);
+            roomId = examResult.getRoomId();
+        }
+
+        CheckUtils.checkArgument(roomId != null, "roomId must't be null");
+
+        ExamRoom examRoom = eduUserFeignService.getExamRoom(Integer.parseInt(roomId));
+
+        boolean isAssistant = false;
+        if (StringUtils.isNotEmpty(examRoom.getAssistantTeacherUserIdList())){
+            List<String> list = Arrays.asList(examRoom.getAssistantTeacherUserIdList().split(","));
+            if(list.contains(userId)){
+                isAssistant = true;
+            }
+        }
+        Date curTime = DateTimeUtils.currentUTC();
+        List<Room> roomList = roomDao.findByRid(roomId);
+        if (roomList.isEmpty()) {
+            saveRoom(roomId, roomId, curTime, null);
+        }
+        RoleEnum roleEnum;
         RoomResult roomResult = new RoomResult();
         BaseResponse baseResponse = new BaseResponse(roomResult);
         RoomResult.MemberResult userResult = new RoomResult.MemberResult();
@@ -161,13 +217,8 @@ public class RoomServiceImpl implements RoomService {
                 }
                 roleEnum = Student;
             }
-            saveRoomMember(userId,sysUser.getAvatar(), realName, roomId, roleEnum.getValue(), !isDisableCamera,!isMusicMode, curTime,registrationId);
-
-            userResult.setMicrophone(true);
-            userResult.setCamera(!isDisableCamera);
-            userResult.setHandUp(false);
-            userResult.setJoinTime(curTime);
             log.info("user join the room: roomId={} , userId={}, roleEnum={}", roomId, userId, roleEnum);
+            saveRoomMember(userId,sysUser.getAvatar(), realName, roomId, roleEnum.getValue(),isDisableCamera, curTime,registrationId);
         } else {
             roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
             if(roleEnum == Student){
@@ -183,32 +234,13 @@ public class RoomServiceImpl implements RoomService {
                     return getBaseResponse(baseResponse);
                 }
             }
-            userResult.setCamera(roomMember.isCamera());
-            userResult.setHandUp(roomMember.isHand());
-            userResult.setJoinTime(roomMember.getJoinDt());
             log.info("user exist in the room: roomId={} , userId={}, use the last role={}", roomId, userId, roleEnum);
         }
-
-        MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
-        msg.setTimestamp(curTime);
-        msg.setUserName(realName);
-        msg.setCamera(!isDisableCamera);
-        imHelper.publishMessage(userId, roomId, msg);
-
-        List<UserInfo> userInfoList = userDao.findByUid(userId);
-        if (userInfoList.isEmpty()) {
-            UserInfo userInfo = new UserInfo();
-            userInfo.setUid(userId);
-            userInfo.setName(realName);
-            userInfo.setCreateDt(curTime);
-            userInfo.setUpdateDt(curTime);
-            userDao.save(userInfo);
-        } else {
-            UserInfo user = userInfoList.get(0);
-            user.setUpdateDt(curTime);
-            userDao.save(user);
-        }
-
+        roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
+        userResult.setMicrophone(roomMember.isMic());
+        userResult.setCamera(roomMember.isCamera());
+        userResult.setHandUp(roomMember.isHand());
+        userResult.setJoinTime(roomMember.getJoinDt());
         userResult.setUserName(realName);
         userResult.setUserId(userId);
         userResult.setRole(roleEnum.getValue());
@@ -218,21 +250,7 @@ public class RoomServiceImpl implements RoomService {
             roomResult.setRegistrationId(registrationId);
         }
         roomResult.setExamFlag(examRoom.getExamFlag());
-
-        List<RoomMember> roomMembers = roomMemberDao.findByRid(roomId);
-        roomResult.setMembers(roomMembers,examRoom.getShieldUserId());
-        log.info("join success: roomId = {}, userId = {}, userName={}, role = {}", roomId, userId, roleEnum);
-        if(registrationId != null){
-            if(examResult.getIsFinishedExam() == 1){
-                eduUserFeignService.updateFinishedExam(registrationId,0);
-            }
-            this.publishMessage(eduUserFeignService.getPublishMessage(registrationId));
-            eduUserFeignService.upsetStudentAttendance(registrationId,0);
-            imHelper.startRecord(userId,roomId, registrationId,roomMembers);
-            //踢出其他学员
-        }else {
-            eduUserFeignService.upsetTeacherAttendance(examRoom.getId(),sysUser.getId(),0);
-        }
+        roomResult.setMembers(roomMemberDao.findByRid(roomId),examRoom.getShieldUserId());
         return baseResponse;
     }
 
@@ -249,7 +267,7 @@ public class RoomServiceImpl implements RoomService {
         }
     }
 
-    private void saveRoomMember(String userId, String headUrl, String userName, String roomId, int role, boolean cameraOn,boolean musicModeOn, Date joinTime,Long examRegistrationId) {
+    private void saveRoomMember(String userId, String headUrl, String userName, String roomId, int role, boolean cameraOn, Date joinTime,Long examRegistrationId) {
         RoomMember roomMember = new RoomMember();
         roomMember.setUid(userId);
         roomMember.setName(userName);
@@ -257,41 +275,34 @@ public class RoomServiceImpl implements RoomService {
         roomMember.setRole(role);
         roomMember.setCamera(cameraOn);
         roomMember.setJoinDt(joinTime);
-        roomMember.setMusicMode(musicModeOn);
         roomMember.setHeadUrl(headUrl);
         roomMember.setExamRegistrationId(examRegistrationId);
         roomMemberDao.save(roomMember);
     }
 
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    @Override
-    public Boolean leaveRoom(Long registrationId,String roomId,String userId) throws Exception {
+    public void leaveRoomSuccess(Long registrationId,String roomId,String userId) throws Exception {
         if(registrationId != null){
             StudentExamResultApiDto examResult = eduUserFeignService.getExamResult(registrationId);
             roomId = examResult.getRoomId();
         }
-        SysUser user;
-        if(StringUtils.isEmpty(userId)){
-            user = sysUserFeignService.queryUserInfo();
-            userId = user.getId().toString();
-        }else {
-            user = sysUserFeignService.queryUserById(Integer.parseInt(userId));
-        }
+
+        SysUser  user = sysUserFeignService.queryUserById(Integer.parseInt(userId));
         log.info("leaveRoom: roomId={}, userId={}", roomId,userId);
 
         CheckUtils.checkArgument(userId != null, "userId must't be null");
         CheckUtils.checkArgument(roomId != null, "roomId must't be null");
+
         List<Room> roomList = roomDao.findByRid(roomId);
         if (roomList.size() == 0) {
             log.error("room : {} not exist ", roomId);
-            return false;
+            return;
         }
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if (roomMember == null) {
             log.error("{} not exist in room: {}", userId, roomId);
-            return false;
+            return;
         }
-
         int userRole = roomMember.getRole();
         log.info("leaveRoom: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
 
@@ -308,10 +319,15 @@ public class RoomServiceImpl implements RoomService {
         userDao.deleteByUid(userId);
         if(registrationId != null){
             eduUserFeignService.upsetStudentAttendance(registrationId,1);
-            imHelper.stopRecord(userId,roomId);
+            imHelper.stopRecord(roomId);
         }else {
             eduUserFeignService.upsetTeacherAttendance(Long.parseLong(roomId),Integer.parseInt(userId),1);
+            imHelper.configRecord(roomId,roomMemberDao.findByRid(roomId));
         }
+    }
+
+    @Override
+    public Boolean leaveRoom(Long registrationId,String roomId,String userId) throws Exception {
         return true;
     }
 
@@ -333,6 +349,11 @@ public class RoomServiceImpl implements RoomService {
         imHelper.dismiss(userId,groupId);
     }
 
+    @Override
+    public void joinFailure(String roomId, String userId) {
+        roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+    }
+
     private void deleteWhiteboardByUser(String roomId, String userId) throws Exception {
         List<Whiteboard> whiteboardList = whiteboardDao.findByRidAndCreator(roomId, userId);
         if (!whiteboardList.isEmpty()) {
@@ -439,7 +460,7 @@ public class RoomServiceImpl implements RoomService {
                 if("3".equals(e.getRole())){
                     try {
                         eduUserFeignService.upsetStudentAttendance(e.getExamRegistrationId(),1);
-                        imHelper.stopRecord(e.getUid(),e.getRid());
+                        imHelper.stopRecord(e.getRid());
                     } catch (Exception e1) {
                         e1.printStackTrace();
                     }
@@ -478,7 +499,7 @@ public class RoomServiceImpl implements RoomService {
             if("recorded".equals(data.getType())){
                 msg.setRoomId("recorded" + roomId);
             }*/
-            imHelper.stopRecord(userId,roomId);
+            imHelper.stopRecord(roomId);
             IMApiResultInfo apiResultInfo = imHelper.publishMessage(userId, roomId, msg, 1);
             if (!apiResultInfo.isSuccess()) {
                 throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR);
@@ -1235,9 +1256,14 @@ public class RoomServiceImpl implements RoomService {
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public boolean statusSync(ChannelStateNotify notify) throws Exception {
+        log.info("statusSync notify:{}",notify);
         String roomId = notify.getChannelId();
         String userId = notify.getUserId();
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
+        log.info("statusSync roomMember:{}",roomMember);
+        if(roomMember == null){
+            return false;
+        }
         if(notify.getEvent() == 1){
             //同步房间信息
         }else if(notify.getEvent() == 2){
@@ -1246,19 +1272,10 @@ public class RoomServiceImpl implements RoomService {
             //房间销毁
         }else if(notify.getEvent() == 11){
             //成员加入
-//            if(roomMember.getRole() != 3){
-//                this.configRecord(roomId);
-//            }else {
-//                this.startRecord(roomId,userId,notify.getTimestamp() + "");
-//            }
+            joinRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId);
         }else if(notify.getEvent() == 12){
             //成员退出
-            /*if(roomMember.getRole() != 3){
-                this.configRecord(roomId,userId);
-            }else {
-                this.stopRecord(roomId,userId);
-            }*/
-            this.leaveRoom(null,roomId,userId);
+            leaveRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId);
         }else if(notify.getEvent() == 20){
             //资源发生变动
         }
@@ -1267,7 +1284,7 @@ public class RoomServiceImpl implements RoomService {
 
     @Override
     public void publishMessage(PublishMessageDto publishMessageDto) throws Exception {
-        IMApiResultInfo apiResultInfo = imHelper.publishMessage(publishMessageDto.getUserId(),
+        imHelper.publishMessage(publishMessageDto.getUserId(),
                 publishMessageDto.getRoomId(),
                 publishMessageDto.getMemberChangedMessage(),
                 publishMessageDto.getIncludeSender());

+ 13 - 9
edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/RoomService.java

@@ -12,15 +12,7 @@ import java.util.List;
  */
 public interface RoomService {
     //everyone
-    BaseResponse joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera, boolean isMusicMode, String roomId) throws Exception;
-
-    void roomQuery(String roomId) throws Exception;
-
-    void configRecord(String roomId) throws Exception;
-
-    void startRecord(String roomId,String userId,String extra) throws Exception;
-
-    void stopRecord(String userId,String roomId) throws Exception;
+    BaseResponse joinRoom(Long registrationId, boolean isDisableCamera,String roomId) throws Exception;
 
     Boolean leaveRoom(Long registrationId,String roomId,String userId) throws Exception;
 
@@ -104,4 +96,16 @@ public interface RoomService {
      * @param groupId
      */
     void dismissGroup(String userId, String groupId) throws Exception;
+
+    /**
+     * @describe 老师加入房间失败后,删除数据
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/8/19
+     * @time 14:16
+     * @param roomId:
+     * @param userId:
+     * @return boolean
+     */
+    void joinFailure(String roomId, String userId);
 }

+ 11 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/BasicNeedCheckingDetailDto.java

@@ -21,6 +21,17 @@ public class BasicNeedCheckingDetailDto {
     @ApiModelProperty(value = "学员编号")
     private Integer studentId;
 
+    @ApiModelProperty(value = "注册编号")
+    private Integer examRegistrationId;
+
+    public Integer getExamRegistrationId() {
+        return examRegistrationId;
+    }
+
+    public void setExamRegistrationId(Integer examRegistrationId) {
+        this.examRegistrationId = examRegistrationId;
+    }
+
     public Integer getClassroomSwitch() {
         return classroomSwitch;
     }

+ 7 - 2
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamCertificationServiceImpl.java

@@ -87,7 +87,10 @@ public class ExamCertificationServiceImpl extends BaseServiceImpl<Long, ExamCert
 		needCheckingDetailDto.setWaitNum(waitNum);
 		needCheckingDetailDto.setDesc(sysConfigService.findConfigValue("exam_room_desc",needCheckingDetailDto.getTenantId()));
 		ExamRegistration examRegistration = examRegistrationDao.get(examRegistrationId);
-		needCheckingDetailDto.setSubjectName(subjectDao.get(examRegistration.getSubjectId()).getName());
+		Subject subject = subjectDao.get(examRegistration.getSubjectId());
+		if(subject != null){
+			needCheckingDetailDto.setSubjectName(subject.getName());
+		}
 		needCheckingDetailDto.setLevel(examRegistration.getLevel());
 		if(needCheckingDetailDto.getFinishedExam() == 4 && needCheckingDetailDto.getRecordStartTime() != null){
 			int recordMinutes = Integer.parseInt(sysConfigService.findConfigValue("record_minutes",needCheckingDetailDto.getTenantId()));
@@ -110,7 +113,9 @@ public class ExamCertificationServiceImpl extends BaseServiceImpl<Long, ExamCert
 	public ExamCertificationDto findDetailByStudentId(Long examRegistrationId) {
 		ExamCertificationDto examCertificationDto = examCertificationDao.getExamCertificationDto(examRegistrationId);
 		Subject subject = subjectDao.get(examCertificationDto.getSubjectId());
-		examCertificationDto.setSubjectName(subject.getName());
+		if(subject != null){
+			examCertificationDto.setSubjectName(subject.getName());
+		}
 		Student student = studentService.getStudent(examCertificationDto.getStudentId());
 		examCertificationDto.setRealName(student.getRealName());
 		examCertificationDto.setGender(student.getGender());

+ 1 - 1
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java

@@ -792,6 +792,7 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 		}
 		studentExamRoom.setSignInTime(new Date());
 		examRoomStudentRelationDao.update(studentExamRoom);
+		studentExamResultDao.updateFinishedExam(examRegistrationId,2);
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		PublishMessageDto publishMessageDto = new PublishMessageDto();
 		String userId = sysUser.getId().toString();
@@ -806,7 +807,6 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 //		msg.setOpenFlag(needCheckingDetailDto.getOpenFlag());
 		publishMessageDto.setMemberChangedMessage(msg);
 		//修改签到状态
-		studentExamResultDao.updateFinishedExam(examRegistrationId,2);
 		msg.setAppParamJson(examCertificationService.basicNeedCheckingDetail(studentExamRoom.getExamRoomId()));
 		imFeignService.publishMessage(publishMessageDto);
 	}

+ 2 - 1
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamCertificationMapper.xml

@@ -189,9 +189,10 @@
 		<result property="finishedExam" column="is_finished_exam_"/>
 		<result property="recordFlag" column="record_flag_"/>
 		<result property="studentId" column="student_id_"/>
+		<result property="examRegistrationId" column="exam_registration_id_"/>
 	</resultMap>
     <select id="basicNeedCheckingDetail" resultMap="BasicNeedCheckingDetailDtoMap">
-		SELECT er.open_flag_,ser.is_finished_exam_,ersr.classroom_switch_,ser.record_flag_,ersr.student_id_
+		SELECT er.open_flag_,ser.is_finished_exam_,ersr.classroom_switch_,ser.record_flag_,ersr.student_id_,ersr.exam_registration_id_
 		FROM exam_room_student_relation ersr
 		LEFT JOIN examination_basic eb ON eb.id_ = ersr.examination_basic_id_
 		LEFT JOIN exam_room er ON er.id_ = ersr.exam_room_id_

+ 2 - 3
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRegistrationMapper.xml

@@ -475,12 +475,11 @@
 		SELECT COUNT(er.id_)
 		FROM exam_registration er
 		LEFT JOIN examination_basic eb ON er.examination_basic_id_ = eb.id_
-		LEFT JOIN exam_subject_song ess ON er.examination_basic_id_ = ess.examination_basic_id_
+		LEFT JOIN exam_subject_song ess ON er.examination_basic_id_ = ess.examination_basic_id_ AND er.subject_id_ = ess.exam_subject_id_ AND er.level_ = ess.level_
 		<include refid="queryStudentListSql"/>
 	</select>
 	<sql id="queryStudentListSql">
 		<where>
-			er.subject_id_ = ess.exam_subject_id_ AND er.level_ = ess.level_
 			<if test="studentId != null">
 				AND er.student_id_ = #{studentId}
 			</if>
@@ -502,7 +501,7 @@
 		eb.expect_exam_start_time_,eb.name_ examBaseName,ess.practice_song_id_list_,ess.perform_song_id_list_
 		FROM exam_registration er
 		LEFT JOIN examination_basic eb ON er.examination_basic_id_ = eb.id_
-		LEFT JOIN exam_subject_song ess ON er.examination_basic_id_ = ess.examination_basic_id_
+		LEFT JOIN exam_subject_song ess ON er.examination_basic_id_ = ess.examination_basic_id_ AND er.subject_id_ = ess.exam_subject_id_ AND er.level_ = ess.level_
 		<include refid="queryStudentListSql"/>
 		ORDER BY er.update_time_ DESC
 		<include refid="global.limit"/>

+ 2 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/config/ResourceServerConfig.java

@@ -26,7 +26,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     public void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests()
                 .antMatchers("/task/*","/v2/api-docs", "/su/**", "/student/apply", "/examRegistration/ocr", "/examOrder/paymentResult",
-                        "/examOrder/notify","/examinationBasic/getInfo","/examOrder/executePayment","/examOrder/pageList","/studentExamResult/recordSync", "/appVersionInfo/queryByPlatform")
+                        "/examOrder/notify","/examinationBasic/getInfo","/examOrder/executePayment","/examOrder/pageList",
+                        "/studentExamResult/recordSync", "/appVersionInfo/queryByPlatform","/*/api/*")
                 .permitAll()
                 .anyRequest().authenticated().and().csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler)
                 .authenticationEntryPoint(baseAuthenticationEntryPoint).and();