Explorar el Código

Merge remote-tracking branch 'origin/master'

周箭河 hace 4 años
padre
commit
6c4fb8c754
Se han modificado 28 ficheros con 371 adiciones y 315 borrados
  1. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ResourceServerConfig.java
  2. 9 2
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/controller/RoomController.java
  3. 92 102
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/mec/im/IMHelper.java
  4. 122 105
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/Impl/RoomServiceImpl.java
  5. 13 9
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/RoomService.java
  6. 2 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamReviewDao.java
  7. 2 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java
  8. 8 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java
  9. 11 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/BasicNeedCheckingDetailDto.java
  10. 12 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/ExamReviewRecordDto.java
  11. 7 2
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamCertificationServiceImpl.java
  12. 23 21
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java
  13. 1 1
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java
  14. 3 1
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamSubjectServiceImpl.java
  15. 8 2
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/StudentExamResultServiceImpl.java
  16. 1 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/StudentServiceImpl.java
  17. 2 1
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamCertificationMapper.xml
  18. 3 3
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRegistrationMapper.xml
  19. 12 3
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamReviewMapper.xml
  20. 16 0
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomMapper.xml
  21. 19 2
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml
  22. 1 1
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamSubjectMapper.xml
  23. 1 1
      edu-user/edu-user-biz/src/main/resources/config/mybatis/SysUserMapper.xml
  24. 0 4
      edu-user/edu-user-server/pom.xml
  25. 0 34
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/config/RabbitConfig.java
  26. 2 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/config/ResourceServerConfig.java
  27. 0 13
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/EmployeeController.java
  28. 0 6
      edu-user/edu-user-server/src/main/resources/application.yml

+ 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.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, String roomId){
+        StudentExamResultApiDto examResult = null;
+        log.info("joinRoom: roomId={}, registrationId={}", roomId,registrationId);
+
+        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(),true, 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,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);
 }

+ 2 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamReviewDao.java

@@ -22,6 +22,8 @@ public interface ExamReviewDao extends BaseDAO<Long, ExamReview> {
     List<ExamReviewDto> findExamResult(Map<String, Object> params);
     int countExamResult(Map<String, Object> params);
 
+    int deleteWithRegist(@Param("registIds") List<Long> registIds);
+
     /**
      * 监考页面评审列表查询
      * @param params

+ 2 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java

@@ -92,6 +92,8 @@ public interface ExamRoomDao extends BaseDAO<Long, ExamRoom> {
      */
     int updateExamRoomStudentNum(@Param("examId") Long examId);
 
+    int updateExamRoomStudentNumWithExams(@Param("examIds") List<Long> examIds);
+
     ExamRoom lockRoom(@Param("examRoomId") Long examRoomId);
 
     /**

+ 8 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java

@@ -47,6 +47,14 @@ public interface ExamRoomStudentRelationDao extends BaseDAO<Long, ExamRoomStuden
     List<Long> findNoFinishedExamRegistIdsWIthExamRooms();
 
     /**
+     * @describe 获取考场中未完成考试的报名编号
+     * @author Joburgess
+     * @date 2020.08.18
+     * @return java.util.List<java.lang.Long>
+     */
+    List<ExamRoomStudentRelation> findNoFinishedExamRegistsWIthExamRooms();
+
+    /**
      * @describe 删除指定教室的学员
      * @author Joburgess
      * @date 2020.06.24

+ 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;
     }

+ 12 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/ExamReviewRecordDto.java

@@ -1,5 +1,6 @@
 package com.keao.edu.user.dto;
 
+import com.keao.edu.user.enums.ExamStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 public class ExamReviewRecordDto {
@@ -7,6 +8,9 @@ public class ExamReviewRecordDto {
     @ApiModelProperty(value = "学员报名编号")
     private Long examRegistrationId;
 
+    @ApiModelProperty(value = "项目状态")
+    private ExamStatusEnum examBasicStatus;
+
     @ApiModelProperty(value = "学员名称")
     private String realName;
 
@@ -37,6 +41,14 @@ public class ExamReviewRecordDto {
     @ApiModelProperty(value = "评审编号")
     private Integer examReviewId;
 
+    public ExamStatusEnum getExamBasicStatus() {
+        return examBasicStatus;
+    }
+
+    public void setExamBasicStatus(ExamStatusEnum examBasicStatus) {
+        this.examBasicStatus = examBasicStatus;
+    }
+
     public Long getExamRegistrationId() {
         return examRegistrationId;
     }

+ 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());

+ 23 - 21
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java

@@ -812,6 +812,12 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		}
 		examRoomDao.update(examRoom);
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		PublishMessageDto publishMessageDto = new PublishMessageDto();
+		publishMessageDto.setUserId(sysUser.getId().toString());
+		publishMessageDto.setRoomId(examRoomId.toString());
+		MemberChangedMessage msg = new MemberChangedMessage(5, sysUser.getId().toString(),3);
+		msg.setAppParamJson(examCertificationService.basicNeedCheckingDetail(examRoomId));
+		publishMessageDto.setMemberChangedMessage(msg);
 		//加群退群
 		if(openFlag == 1){
 			String studentIds = examRoomStudentRelationService.getStudentIds(examRoomId);
@@ -825,18 +831,6 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 				stringBuffer.append(",").append(examRoom.getAssistantTeacherUserIdList());
 			}
 			imFeignService.joinGroup(stringBuffer.toString(),examRoomId.toString(),examRoomId.toString());
-			PublishMessageDto publishMessageDto = new PublishMessageDto();
-			publishMessageDto.setUserId(sysUser.getId().toString());
-			publishMessageDto.setRoomId(examRoomId.toString());
-			MemberChangedMessage msg = new MemberChangedMessage(5, sysUser.getId().toString(),3);
-			msg.setAppParamJson(examCertificationService.basicNeedCheckingDetail(examRoomId));
-//			msg.setWaitNum(0);
-//			msg.setClassroomSwitch(0);
-//			msg.setOpenFlag(openFlag);
-//			Map<String,Object> paramMap = new HashMap<>(1);
-//			paramMap.put("studentQueue",examRoomStudentRelationService.queryNeedCheckingList(examRoomId));
-//			msg.setWebParamJson(JSONObject.toJSONString(paramMap));
-			publishMessageDto.setMemberChangedMessage(msg);
 			imFeignService.publishMessage(publishMessageDto);
 			if(StringUtils.isNotEmpty(studentIds)){
 				List<RoomStudentListDto> roomStudentListDtos = examRoomStudentRelationDao.queryStudentList(examRoomId);
@@ -872,6 +866,7 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 			if(i == 0){
 				throw new BizException("操作失败:还有老师没完成评审");
 			}
+			imFeignService.publishMessage(publishMessageDto);
 //			imFeignService.dismissGroup(sysUser.getId().toString(),examRoomId.toString());
 			studentExamResultService.calculateStudentExamAvgScore(examRoomId);
 			imFeignService.destroyRoom(examRoomId,sysUser.getId().toString());
@@ -901,21 +896,28 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 	@Transactional(rollbackFor = Exception.class)
 	public void cleanExamRoom() {
 		List<ExamRoom> examRooms = examRoomDao.getHistoryOpenExamRoom();
-		if(CollectionUtils.isEmpty(examRooms)){
-			return;
-		}
+
 		for (ExamRoom examRoom : examRooms) {
 			examRoom.setOpenFlag(0);
 			imFeignService.destroyRoom(examRoom.getId(),examRoom.getMainTeacherUserId().toString());
 			studentExamResultService.calculateStudentExamAvgScore(examRoom.getId());
 		}
-		examRoomDao.batchUpdate(examRooms);
+		if(!CollectionUtils.isEmpty(examRooms)){
+			examRoomDao.batchUpdate(examRooms);
+		}
 
-		List<Long> registIds = examRoomStudentRelationDao.findNoFinishedExamRegistIdsWIthExamRooms();
-		if(!CollectionUtils.isEmpty(registIds)){
-			examRoomStudentRelationDao.deleteStudentRoomRegistRelations(registIds);
-			examCertificationDao.deleteWithRegist(registIds);
-			studentExamResultDao.deleteWithRegists(registIds);
+		List<ExamRoomStudentRelation> students = examRoomStudentRelationDao.findNoFinishedExamRegistsWIthExamRooms();
+		if(CollectionUtils.isEmpty(students)){
+			return;
 		}
+
+		Set<Long> registIds = students.stream().map(ExamRoomStudentRelation::getExamRegistrationId).collect(Collectors.toSet());
+		examRoomStudentRelationDao.deleteStudentRoomRegistRelations(new ArrayList<>(registIds));
+		examCertificationDao.deleteWithRegist(new ArrayList<>(registIds));
+		examReviewDao.deleteWithRegist(new ArrayList<>(registIds));
+		studentExamResultDao.deleteWithRegists(new ArrayList<>(registIds));
+
+		Set<Long> examIds = students.stream().map(ExamRoomStudentRelation::getExaminationBasicId).collect(Collectors.toSet());
+		examRoomDao.updateExamRoomStudentNumWithExams(new ArrayList<>(examIds));
 	}
 }

+ 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);
 	}

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

@@ -12,6 +12,8 @@ import com.keao.edu.user.service.ExamSubjectService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 @Service
@@ -40,6 +42,6 @@ public class ExamSubjectServiceImpl extends BaseServiceImpl<Long, ExamSubject> i
 	@Override
 	public List<Subject> getStudentExamSubjects(Integer examId) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		return examSubjectDao.getStudentExamSubjects(examId,sysUser.getId());
+		return examSubjectDao.getStudentExamSubjects(examId, sysUser.getId());
 	}
 }

+ 8 - 2
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/StudentExamResultServiceImpl.java

@@ -131,8 +131,8 @@ public class StudentExamResultServiceImpl extends BaseServiceImpl<Long, StudentE
 		if(Objects.isNull(examRoom)){
 			throw new BizException("考场信息异常");
 		}
-		if(Objects.isNull(oldStudentExamResult.getAvgScore())&& ExamModeEnum.ONLINE.equals(examRoom.getExamMode())){
-			throw new BizException("考试未结束");
+		if(oldStudentExamResult.getIsFinishedExam()!=5 && ExamModeEnum.ONLINE.equals(examRoom.getExamMode())){
+			throw new BizException("此考生未完成考试,暂不可修改考试结果");
 		}
 		if(ExamModeEnum.OFFLINE.equals(examRoom.getExamMode())){
 			studentExamResult.setIsFinishedExam(5);
@@ -170,7 +170,13 @@ public class StudentExamResultServiceImpl extends BaseServiceImpl<Long, StudentE
 			}
 			String examName = examIdNameMap.get(studentExamResult.getExaminationBasicId());
 			String subjectName = subjectIdNameMap.get(studentExamResult.getExamRegistration().getSubjectId());
+			if(StringUtils.isBlank(subjectName)){
+				subjectName="";
+			}
 			String level = LevelEnum.getMsg(studentExamResult.getExamRegistration().getLevel());
+			if(StringUtils.isBlank(level)){
+				level = "";
+			}
 
 			Map<Integer, String> userPhoneMap = new HashMap<>();
 			userPhoneMap.put(studentExamResult.getStudentId(), studentExamResult.getStudentId().toString());

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

@@ -60,6 +60,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
         SysUser user = sysUserDao.queryByPhone(sysUser.getPhone());
         if (user != null && user.getId() != null) {
+            sysUserDao.lockUser(sysUser.getId());
             Employee employee = employeeDao.get(user.getId());
             if(employee != null && employee.getDelFlag() == false && employee.getEmployeeType().equals("ORGAN")){
                 throw new BizException("手机号被占用");

+ 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_

+ 3 - 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"/>
@@ -610,6 +609,7 @@
 	</select>
 	<sql id="queryStudentBaseExamsSql">
 		<where>
+			er.subject_id_ != 0
 			<if test="studentId != null">
 				AND er.student_id_ = #{studentId}
 			</if>

+ 12 - 3
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamReviewMapper.xml

@@ -90,8 +90,15 @@
 	<delete id="delete" >
 		DELETE FROM exam_review WHERE id_ = #{id} 
 	</delete>
-	
-	<!-- 分页查询 -->
+
+    <delete id="deleteWithRegist">
+		DELETE FROM	exam_review WHERE exam_registration_id_ IN
+		<foreach collection="registIds" item="registId" separator="," open="(" close=")">
+			#{registId}
+		</foreach>
+	</delete>
+
+    <!-- 分页查询 -->
 	<select id="queryPage" resultMap="ExamReview" parameterType="map">
 		SELECT * FROM exam_review
 		ORDER BY id_
@@ -197,6 +204,7 @@
 		<result property="finishedExam" column="is_finished_exam_"/>
 		<result property="videoUrl" column="video_url_"/>
 		<result property="examRegistrationId" column="exam_registration_id_"/>
+		<result property="examBasicStatus" column="status_" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
 	</resultMap>
 	<sql id="queryExamReviewRecordListSql">
 		<where>
@@ -217,8 +225,9 @@
 
 	<select id="queryExamReviewRecordList" resultMap="ExamReviewRecordDtoMap">
 		SELECT ser.is_finished_exam_,ser.record_flag_,ser.confirm_status_,er.evaluation_content_,
-		er.evaluation_result_,ersr.exam_registration_id_,er.id_,ersr.student_id_,ser.video_url_
+		er.evaluation_result_,ersr.exam_registration_id_,er.id_,ersr.student_id_,ser.video_url_,eb.status_
 		FROM exam_room_student_relation ersr
+		LEFT JOIN examination_basic eb ON eb.id_ = ersr.examination_basic_id_
 		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = ersr.exam_registration_id_
 		LEFT JOIN exam_review er ON ser.exam_registration_id_ = er.exam_registration_id_ AND er.teacher_id_ = #{teacherId}
 		<include refid="queryExamReviewRecordListSql"/>

+ 16 - 0
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomMapper.xml

@@ -250,6 +250,22 @@
 			er.examination_basic_id_ = #{examId} AND er.id_ = ers.exam_room_id_
 	</update>
 
+	<update id="updateExamRoomStudentNumWithExams">
+		UPDATE exam_room er
+		LEFT JOIN ( SELECT exam_room_id_, COUNT( exam_registration_id_ ) stu_num_ FROM exam_room_student_relation
+		WHERE examination_basic_id_ IN
+		<foreach collection="examIds" item="examId" separator="," open="(" close=")">
+			#{examId}
+		</foreach>
+		GROUP BY exam_room_id_ ) ers ON er.id_ = ers.exam_room_id_
+		SET er.exam_room_student_num_ = CASE WHEN ers.stu_num_ IS NULL THEN 0 ELSE ers.stu_num_ END
+		WHERE
+			er.examination_basic_id_ IN
+			<foreach collection="examIds" item="examId" separator="," open="(" close=")">
+				#{examId}
+			</foreach>
+	</update>
+
     <!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM exam_room WHERE id_ = #{id} 

+ 19 - 2
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml

@@ -329,12 +329,29 @@
 
     <select id="findNoFinishedExamRegistIdsWIthExamRooms" resultType="long">
 		SELECT
-			ser.exam_registration_id_
+			DISTINCT ser.exam_registration_id_
 		FROM
 			student_exam_result ser
 			LEFT JOIN exam_room er ON ser.exam_room_id_ = er.id_
+			LEFT JOIN examination_basic eb ON ser.examination_basic_id_ = eb.id_
 		WHERE
 			ser.is_finished_exam_ != 5
-			AND er.exam_end_time_&lt;NOW()
+			AND eb.status_ != 'RESULT_CONFIRM'
+			AND er.exam_end_time_ &lt; NOW( )
+			AND ser.result_ IS NULL
+	</select>
+
+	<select id="findNoFinishedExamRegistsWIthExamRooms" resultMap="ExamRoomStudentRelation">
+		SELECT
+			DISTINCT ser.*
+		FROM
+			student_exam_result ser
+			LEFT JOIN exam_room er ON ser.exam_room_id_ = er.id_
+			LEFT JOIN examination_basic eb ON ser.examination_basic_id_ = eb.id_
+		WHERE
+			ser.is_finished_exam_ != 5
+			AND eb.status_ != 'RESULT_CONFIRM'
+			AND er.exam_end_time_ &lt; NOW( )
+			AND ser.result_ IS NULL
 	</select>
 </mapper>

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

@@ -103,7 +103,7 @@
 	<select id="getStudentExamSubjects" resultMap="com.keao.edu.user.dao.SubjectDao.Subject">
 		SELECT s.* FROM exam_registration er
 		LEFT JOIN subject s on er.subject_id_ = s.id_
-		WHERE er.examination_basic_id_ = #{examId} AND er.student_id_ = #{studentId}
+		WHERE er.examination_basic_id_ = #{examId} AND er.student_id_ = #{studentId} AND er.subject_id_ = s.id_
 		GROUP BY s.id_
 	</select>
 </mapper>

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

@@ -169,7 +169,7 @@
 	</select>
 
     <select id="lockUser" resultType="int">
-        SELECT id_ FROM sys_user WHERE id_=#{userId}
+        SELECT id_ FROM sys_user WHERE id_ = #{userId}
     </select>
     
     <select id="queryByStatus" resultMap="SysUser">

+ 0 - 4
edu-user/edu-user-server/pom.xml

@@ -24,10 +24,6 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-websocket</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-amqp</artifactId>
-		</dependency>
 
 		<dependency>
 			<groupId>org.springframework.cloud</groupId>

+ 0 - 34
edu-user/edu-user-server/src/main/java/com/keao/edu/user/config/RabbitConfig.java

@@ -1,34 +0,0 @@
-package com.keao.edu.user.config;
-
-
-import org.springframework.amqp.core.*;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class RabbitConfig {
-    //交换机名称
-    public static final String ITEM_TOPIC_EXCHANGE = "item_topic_exchange";
-    //队列名称
-    public static final String ITEM_QUEUE = "item_queue";
-
-    //声明交换机
-    @Bean("itemTopicExchange")
-    public Exchange topicExchange(){
-        return ExchangeBuilder.topicExchange(ITEM_TOPIC_EXCHANGE).durable(true).build();
-    }
-
-    //声明队列
-    @Bean("itemQueue")
-    public Queue itemQueue(){
-        return QueueBuilder.durable(ITEM_QUEUE).build();
-    }
-
-    //绑定队列和交换机
-    @Bean
-    public Binding itemQueueExchange(@Qualifier("itemQueue") Queue queue,
-                                     @Qualifier("itemTopicExchange") Exchange exchange){
-        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
-    }
-}

+ 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();

+ 0 - 13
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/EmployeeController.java

@@ -7,14 +7,12 @@ import com.keao.edu.common.controller.BaseController;
 import com.keao.edu.common.entity.HttpResponseResult;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.tenant.TenantContextHolder;
-import com.keao.edu.user.config.RabbitConfig;
 import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.page.EmployeeQueryInfo;
 import com.keao.edu.user.service.EmployeeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -28,8 +26,6 @@ public class EmployeeController extends BaseController {
 	private EmployeeService employeeService;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
-	@Autowired
-	private RabbitTemplate rabbitTemplate;
 	
 	@ApiOperation("员工服务分页查询")
 	@GetMapping(value = "/list")
@@ -91,13 +87,4 @@ public class EmployeeController extends BaseController {
 		employeeService.del(id);
 		return succeed();
 	}
-
-	@ApiOperation("删除")
-	@PostMapping(value = "/sendMsg")
-	@PreAuthorize("@pcs.hasPermissions('employee/sendMsg')")
-	public HttpResponseResult sendMsg() {
-		rabbitTemplate.convertAndSend(RabbitConfig.ITEM_TOPIC_EXCHANGE ,"item.springboot-rabbitmq" ,"springboot-rabbitmq-producer");
-		return succeed();
-	}
-
 }

+ 0 - 6
edu-user/edu-user-server/src/main/resources/application.yml

@@ -74,12 +74,6 @@ spring:
         #连接池中的最小空闲连接
         min-idle: 1
 
-  rabbitmq:
-    host: 47.114.176.40
-    port: 5672
-    username: guest
-    password: guest
-
 mybatis:
   mapperLocations: classpath*:config/mybatis/*.xml
   typeAliasesPackage: com.keao.edu.*.entity