Joburgess 5 년 전
부모
커밋
fdaf1faba7

+ 2 - 1
edu-common/src/main/java/com/keao/edu/common/enums/MessageTypeEnum.java

@@ -20,7 +20,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     EXAM_ROOM_CONFIRM_TEACHER_SMS("EXAM_ROOM_CONFIRM_TEACHER_SMS", "考场已确认"),
     BEFORE_EXAM_TEACHER_REMIND_SMS("BEFORE_EXAM_TEACHER_REMIND_SMS","明日考试安排"),
     BEFORE_EXAM_STUDENT_REMIND_PUSH("BEFORE_EXAM_STUDENT_REMIND_PUSH","明日考试安排"),
-    BEFORE_EXAM_STUDENT_REMIND_SMS("BEFORE_EXAM_STUDENT_REMIND_SMS","明日考试安排");
+    BEFORE_EXAM_STUDENT_REMIND_SMS("BEFORE_EXAM_STUDENT_REMIND_SMS","明日考试安排"),
+    EXAM_RESULT_CONFIRM_PUSH("EXAM_RESULT_CONFIRM_PUSH", "考试结果已确认");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

+ 10 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java

@@ -4,6 +4,7 @@ package com.keao.edu.user.dao;
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.user.api.entity.ExamRoom;
 import com.keao.edu.user.dto.ExamRoomDto;
+import com.keao.edu.user.dto.ExamRoomExamTimeDto;
 import com.keao.edu.user.dto.ExamRoomListDto;
 import org.apache.ibatis.annotations.Param;
 
@@ -41,6 +42,15 @@ public interface ExamRoomDao extends BaseDAO<Long, ExamRoom> {
     int countExamRoom(Map<String, Object> params);
 
     /**
+     * @describe 获取考场首尾考试时间
+     * @author Joburgess
+     * @date 2020.07.24
+     * @param examId:
+     * @return com.keao.edu.user.dto.ExamRoomExamTimeDto
+     */
+    ExamRoomExamTimeDto getExamRoomExamTime(@Param("examId") Long examId);
+
+    /**
      * @describe 删除指定教室
      * @author Joburgess
      * @date 2020.06.24

+ 9 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/StudentExamResultDao.java

@@ -16,6 +16,15 @@ public interface StudentExamResultDao extends BaseDAO<Long, StudentExamResult> {
     int deleteWithRegists(@Param("registIds") List<Long> registIds);
 
     /**
+     * @describe 获取指定考级项目的考级结果
+     * @author Joburgess
+     * @date 2020.07.24
+     * @param examId:
+     * @return java.util.List<com.keao.edu.user.entity.StudentExamResult>
+     */
+    List<StudentExamResult> getWithExam(@Param("examId") Long examId);
+
+    /**
      * @describe 查询考试结果
      * @author Joburgess
      * @date 2020.06.30

+ 30 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/ExamRoomExamTimeDto.java

@@ -0,0 +1,30 @@
+package com.keao.edu.user.dto;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2020.07.24
+ */
+public class ExamRoomExamTimeDto {
+
+    private Date examStartTime;
+
+    private Date examEndTime;
+
+    public Date getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Date examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Date getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Date examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+}

+ 55 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/enums/LevelEnum.java

@@ -0,0 +1,55 @@
+package com.keao.edu.user.enums;
+
+import com.keao.edu.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2020.07.24
+ **/
+public enum LevelEnum implements BaseEnum<Integer, LevelEnum> {
+    ONE(1, "一级"),
+    TWO(2, "一级"),
+    THREE(3, "一级"),
+    FOUR(4, "一级"),
+    FIVE(5, "一级"),
+    SIX(6, "一级"),
+    SEVEN(7, "一级"),
+    EIGHT(8, "一级"),
+    NINE(9, "一级"),
+    TEN(10, "一级"),;
+
+    private Integer code;
+
+    private String msg;
+
+    LevelEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public static String getMsg(Integer code){
+        for (LevelEnum levelEnum : values()) {
+            if(levelEnum.getCode().equals(code)){
+                return levelEnum.getMsg();
+            }
+        }
+        return null;
+    }
+}

+ 1 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamOrganizationRelationServiceImpl.java

@@ -338,7 +338,7 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 
 			SysUser organUser = sysUserDao.getWithOrgan(examOrgan.getOrganId());
 			Map<Integer, String> userPhoneMap = new HashMap<>();
-			userPhoneMap.put(examOrgan.getOrganId(), organUser.getPhone());
+			userPhoneMap.put(organUser.getId(), organUser.getPhone());
 
 			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGISTRATION_URL_SMS,
 					userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,

+ 46 - 15
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java

@@ -20,6 +20,7 @@ import com.keao.edu.user.api.entity.ExamRoomStudentRelation;
 import com.keao.edu.user.api.enums.ExamModeEnum;
 import com.keao.edu.user.dao.*;
 import com.keao.edu.user.dto.ExamRoomDto;
+import com.keao.edu.user.dto.ExamRoomExamTimeDto;
 import com.keao.edu.user.dto.ExamRoomListDto;
 import com.keao.edu.user.dto.ExamRoomStatisticsDto;
 import com.keao.edu.user.entity.ExamLifecycleLog;
@@ -232,23 +233,18 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 			examRooms.add(er);
 		}
 		checkRoomTeachers(examRooms);
+		examRoomDao.batchInsert(examRooms);
 
-		Date minStartTime = examRooms.stream().min(Comparator.comparing(ExamRoom::getExamStartTime)).get().getExamStartTime();
-		Date maxEndTime = examRooms.stream().max(Comparator.comparing(ExamRoom::getExamEndTime)).get().getExamEndTime();
+		ExamRoomExamTimeDto examRoomExamTime = examRoomDao.getExamRoomExamTime(examRoom.getExaminationBasicId());
 
-		if(Objects.isNull(examinationBasic.getActualExamStartTime())){
-			examinationBasic.setActualExamStartTime(minStartTime);
-		}
-		if(Objects.isNull(examinationBasic.getActualExamEndTime())){
-			examinationBasic.setActualExamEndTime(maxEndTime);
-		}
-		if(minStartTime.compareTo(examinationBasic.getActualExamStartTime())<0){
-			examinationBasic.setActualExamStartTime(DateUtils.truncate(minStartTime, Calendar.DAY_OF_MONTH));
-		}
-		if(maxEndTime.compareTo(examinationBasic.getActualExamEndTime())>0){
-			examinationBasic.setActualExamEndTime(DateUtils.ceiling(maxEndTime, Calendar.DAY_OF_MONTH));
+		if(Objects.isNull(examRoomExamTime)){
+			examinationBasic.setActualExamStartTime(null);
+			examinationBasic.setActualExamEndTime(null);
+		}else{
+			examinationBasic.setActualExamStartTime(DateUtils.truncate(examRoomExamTime.getExamStartTime(), Calendar.DAY_OF_MONTH));
+			examinationBasic.setActualExamEndTime(DateUtils.ceiling(examRoomExamTime.getExamEndTime(), Calendar.DAY_OF_MONTH));
 		}
-		examRoomDao.batchInsert(examRooms);
+
 		examinationBasicDao.update(examinationBasic);
 
 		examTeacherSalaryService.teacherSalarySettlementWithExam(examinationBasic.getId());
@@ -257,10 +253,18 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 	@Override
 	public ExamRoom updateExamRoom(ExamRoom examRoom) {
 		if(Objects.isNull(examRoom.getId())){
-			throw new BizException("请指定教室");
+			throw new BizException("请指定考场");
 		}
 
 		ExamRoom existExamRoom = examRoomDao.get(examRoom.getId());
+		if(Objects.isNull(existExamRoom)){
+			throw new BizException("考场不存在");
+		}
+
+		ExaminationBasic examinationBasic = examinationBasicDao.get(examRoom.getExaminationBasicId().longValue());
+		if(Objects.isNull(examinationBasic)){
+			throw new BizException("考级项目不存在");
+		}
 
 		ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(existExamRoom.getExaminationBasicId(), examRoom.getOrganId());
 		if(Objects.isNull(examOrganizationRelation)||examOrganizationRelation.getIsAllowArrangeExam()==0){
@@ -316,6 +320,17 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		checkRoomTeachers(examRooms);
 
 		examRoomDao.update(examRoom);
+
+		ExamRoomExamTimeDto examRoomExamTime = examRoomDao.getExamRoomExamTime(examRoom.getExaminationBasicId());
+		if(Objects.isNull(examRoomExamTime)){
+			examinationBasic.setActualExamStartTime(null);
+			examinationBasic.setActualExamEndTime(null);
+		}else{
+			examinationBasic.setActualExamStartTime(DateUtils.truncate(examRoomExamTime.getExamStartTime(), Calendar.DAY_OF_MONTH));
+			examinationBasic.setActualExamEndTime(DateUtils.ceiling(examRoomExamTime.getExamEndTime(), Calendar.DAY_OF_MONTH));
+		}
+		examinationBasicDao.update(examinationBasic);
+
 		examTeacherSalaryService.teacherSalarySettlementWithExam(examRoom.getExaminationBasicId());
 		return examRoom;
 	}
@@ -330,6 +345,11 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 
 		ExamRoom examRoom = examRoomDao.get(examRoomIds.get(0));
 
+		ExaminationBasic examinationBasic = examinationBasicDao.get(examRoom.getExaminationBasicId().longValue());
+		if(Objects.isNull(examinationBasic)){
+			throw new BizException("考级项目不存在");
+		}
+
 		ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examRoom.getExaminationBasicId(), organId);
 		if(Objects.isNull(examOrganizationRelation)||examOrganizationRelation.getIsAllowArrangeExam()==0){
 			throw new BizException("无权操作");
@@ -346,6 +366,17 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		}
 
 		examRoomDao.batchDeleteExamRooms(examRoomIds);
+
+		ExamRoomExamTimeDto examRoomExamTime = examRoomDao.getExamRoomExamTime(examRoom.getExaminationBasicId());
+		if(Objects.isNull(examRoomExamTime)){
+			examinationBasic.setActualExamStartTime(null);
+			examinationBasic.setActualExamEndTime(null);
+		}else{
+			examinationBasic.setActualExamStartTime(DateUtils.truncate(examRoomExamTime.getExamStartTime(), Calendar.DAY_OF_MONTH));
+			examinationBasic.setActualExamEndTime(DateUtils.ceiling(examRoomExamTime.getExamEndTime(), Calendar.DAY_OF_MONTH));
+		}
+		examinationBasicDao.update(examinationBasic);
+
 		examTeacherSalaryService.teacherSalarySettlementWithExam(examRoom.getExaminationBasicId());
 	}
 

+ 12 - 5
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExaminationBasicServiceImpl.java

@@ -18,6 +18,7 @@ import com.keao.edu.user.page.ExaminationQueryInfo;
 import com.keao.edu.user.service.ExamOrganizationRelationService;
 import com.keao.edu.user.service.ExaminationBasicService;
 import com.keao.edu.user.service.OrganizationService;
+import com.keao.edu.user.service.StudentExamResultService;
 import com.keao.edu.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateUtils;
@@ -54,6 +55,8 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
     private ExamLifecycleLogDao examLifecycleLogDao;
     @Autowired
     private SysMessageService sysMessageService;
+    @Autowired
+    private StudentExamResultService studentExamResultService;
 
     @Override
     public BaseDAO<Long, ExaminationBasic> getDAO() {
@@ -140,11 +143,11 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
                 examOrganizationRelationService.examRegistCutOffPush(exam.getId());
                 continue;
             }
-//            if (Objects.nonNull(exam.getActualExamEndTime())
-//                    &&exam.getStatus().getOrder()<ExamStatusEnum.EXAM_END.getOrder()
-//                    &&now.compareTo(exam.getActualExamEndTime()) >= 0) {
-//                exam.setStatus(ExamStatusEnum.EXAM_END);
-//            }
+            if (Objects.nonNull(exam.getActualExamEndTime())
+                    &&exam.getStatus().equals(ExamStatusEnum.EXAM_ING)
+                    &&now.compareTo(exam.getActualExamEndTime()) >= 0) {
+                exam.setStatus(ExamStatusEnum.EXAM_END);
+            }
         }
         examinationBasicDao.batchUpdate(exams);
     }
@@ -168,7 +171,11 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
         if(ExamStatusEnum.DELETE.equals(statusEnum)){
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "删除考级项目", operatorId));
         }else if(ExamStatusEnum.RESULT_CONFIRM.equals(statusEnum)){
+            if(ExamStatusEnum.EXAM_END.equals(existsExam.getStatus())){
+                throw new BizException("考试未结束");
+            }
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "确认考试结果", operatorId));
+            studentExamResultService.examResultConfirmPush(examId);
         }else if(ExamStatusEnum.CLOSE.equals(statusEnum)){
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "关闭考级项目", operatorId));
             examOrganizationRelationService.examStatusChangePush(examId, statusEnum);

+ 29 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/StudentExamResultServiceImpl.java

@@ -1,9 +1,15 @@
 package com.keao.edu.user.service.impl;
 
+import com.keao.edu.auth.api.client.SysUserFeignService;
+import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.enums.MessageTypeEnum;
 import com.keao.edu.common.exception.BizException;
 import com.keao.edu.common.page.PageInfo;
+import com.keao.edu.common.service.SysMessageService;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
+import com.keao.edu.thirdparty.message.provider.JiguangPushPlugin;
+import com.keao.edu.thirdparty.message.provider.YimeiSmsPlugin;
 import com.keao.edu.user.api.entity.ExamRoomStudentRelation;
 import com.keao.edu.user.api.entity.Student;
 import com.keao.edu.user.api.enums.StudentExamResultApiDto;
@@ -17,6 +23,7 @@ import com.keao.edu.user.entity.Organization;
 import com.keao.edu.user.entity.StudentExamResult;
 import com.keao.edu.user.entity.Subject;
 import com.keao.edu.user.enums.ExamStatusEnum;
+import com.keao.edu.user.enums.LevelEnum;
 import com.keao.edu.user.page.StudentExamResultQueryInfo;
 import com.keao.edu.user.service.OrganizationService;
 import com.keao.edu.user.service.StudentExamResultService;
@@ -39,6 +46,8 @@ public class StudentExamResultServiceImpl extends BaseServiceImpl<Long, StudentE
 	private ExamRoomStudentRelationDao examRoomStudentRelationDao;
 	@Autowired
 	private OrganizationService organizationService;
+	@Autowired
+	private SysMessageService sysMessageService;
 
 	@Override
 	public BaseDAO<Long, StudentExamResult> getDAO() {
@@ -103,11 +112,31 @@ public class StudentExamResultServiceImpl extends BaseServiceImpl<Long, StudentE
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void examResultConfirmPush(Long examId) {
 		if(Objects.isNull(examId)){
 			return;
 		}
+		List<StudentExamResult> studentExamResults = studentExamResultDao.getWithExam(examId);
+
+		Set<Long> examIds = studentExamResults.stream().map(StudentExamResult::getExaminationBasicId).collect(Collectors.toSet());
+		Map<Long, String> examIdNameMap = this.getMap("examination_basic", "id_", "name_", new ArrayList(examIds), Long.class, String.class);
+
+		Set<Subject> subjectIds = studentExamResults.stream().map(e -> e.getExamRegistration().getSubject()).collect(Collectors.toSet());
+		Map<Integer, String> subjectIdNameMap = this.getMap("subject", "id_", "name_", new ArrayList(subjectIds), Integer.class, String.class);
 
+		for (StudentExamResult studentExamResult : studentExamResults) {
+			String examName = examIdNameMap.get(studentExamResult.getExaminationBasicId());
+			String subjectName = subjectIdNameMap.get(studentExamResult.getExamRegistration().getSubjectId());
+			String level = LevelEnum.getMsg(studentExamResult.getExamRegistration().getLevel());
+
+			Map<Integer, String> userPhoneMap = new HashMap<>();
+			userPhoneMap.put(studentExamResult.getStudentId(), studentExamResult.getStudentId().toString());
+
+			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_RESULT_CONFIRM_PUSH,
+					userPhoneMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME,
+					examName, subjectName, level, studentExamResult.getResult().getMsg());
+		}
 	}
 
 	@Override

+ 3 - 1
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamReviewMapper.xml

@@ -141,7 +141,7 @@
 				AND DATE_FORMAT( ero.exam_start_time_, '%Y-%m-%d' ) BETWEEN  DATE_FORMAT( #{examStartTime}, '%Y-%m-%d' ) AND DATE_FORMAT( #{examEndTime}, '%Y-%m-%d' )
 			</if>
 			<if test="search!=null and search!=''">
-				AND su.real_name_ LIKE CONCAT('%', #{search}, '%')
+				AND (ere.card_no_=#{search} OR su.real_name_ LIKE CONCAT('%', #{search}, '%') OR stu.real_name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
 		</where>
 	</sql>
@@ -161,6 +161,7 @@
 			LEFT JOIN exam_registration ere ON ere.id_=er.exam_registration_id_
 			LEFT JOIN exam_room ero ON ero.id_=er.exam_room_id_
 			LEFT JOIN sys_user su ON su.id_=er.teacher_id_
+			LEFT JOIN sys_user stu ON stu.id_=ere.student_id_
 		<include refid="findExamResultCondition"/>
 		ORDER BY ere.id_ DESC
 		<include refid="global.limit"/>
@@ -173,6 +174,7 @@
 			LEFT JOIN exam_registration ere ON ere.id_=er.exam_registration_id_
 			LEFT JOIN exam_room ero ON ero.id_=er.exam_room_id_
 			LEFT JOIN sys_user su ON su.id_=er.teacher_id_
+			LEFT JOIN sys_user stu ON stu.id_=ere.student_id_
 		<include refid="findExamResultCondition"/>
 	</select>
 	<select id="countExamReviewRecordList" resultType="java.lang.Integer">

+ 7 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRoomMapper.xml

@@ -404,4 +404,11 @@
 	<select id="getWithExamAndSubject" resultMap="ExamRoom">
 		SELECT * FROM exam_room WHERE examination_basic_id_=#{examId} AND FIND_IN_SET(#{subjectId}, subject_id_list_);
 	</select>
+
+    <select id="getExamRoomExamTime" resultType="com.keao.edu.user.dto.ExamRoomExamTimeDto">
+		SELECT
+			MIN(exam_start_time_) examStartTime,
+			MAX(exam_end_time_) examEndTime
+		FROM exam_room WHERE examination_basic_id_=#{examId}
+    </select>
 </mapper>

+ 0 - 8
edu-user/edu-user-server/src/main/resources/config/mybatis/ExaminationBasicMapper.xml

@@ -88,12 +88,8 @@
 			<if test="expectExamEndTime != null">
 				expect_exam_end_time_ = #{expectExamEndTime},
 			</if>
-			<if test="actualExamStartTime != null">
 				actual_exam_start_time_ = #{actualExamStartTime},
-			</if>
-			<if test="actualExamEndTime != null">
 				actual_exam_end_time_ = #{actualExamEndTime},
-			</if>
 			<if test="posterTitle != null">
 				poster_title_ = #{posterTitle},
 			</if>
@@ -147,12 +143,8 @@
 				<if test="exam.expectExamEndTime != null">
 					expect_exam_end_time_ = #{exam.expectExamEndTime},
 				</if>
-				<if test="exam.actualExamStartTime != null">
 					actual_exam_start_time_ = #{exam.actualExamStartTime},
-				</if>
-				<if test="exam.actualExamEndTime != null">
 					actual_exam_end_time_ = #{exam.actualExamEndTime},
-				</if>
 				<if test="exam.posterTitle != null">
 					poster_title_ = #{exam.posterTitle},
 				</if>

+ 6 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/StudentExamResultMapper.xml

@@ -268,4 +268,10 @@
 	<select id="getStudentExamResultApiDto" resultMap="StudentExamResultApiDto">
 		SELECT * FROM student_exam_result WHERE exam_registration_id_ = #{examRegistrationId} LIMIT 1
 	</select>
+
+	<select id="getWithExam" resultMap="StudentExamResult">
+		SELECT ser.*,er.subject_id_ regist_subject_id_,er.level_ regist_level_ FROM student_exam_result ser
+		LEFT JOIN exam_registration er ON ser.exam_registration_id_ = er.id_
+		WHERE examination_basic_id_=#{examId}
+	</select>
 </mapper>