Joburgess 5 years ago
parent
commit
f37fdd679a

+ 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 - 5
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java

@@ -911,11 +911,17 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 			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));
+		studentExamResultDao.deleteWithRegists(new ArrayList<>(registIds));
+
+		Set<Long> examIds = students.stream().map(ExamRoomStudentRelation::getExaminationBasicId).collect(Collectors.toSet());
+		examRoomDao.updateExamRoomStudentNumWithExams(new ArrayList<>(examIds));
 	}
 }

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

@@ -250,6 +250,23 @@
 			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.id_ = ers.exam_room_id_
+			AND 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} 

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

@@ -329,13 +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" resultType="long">
+		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>