zouxuan 5 年之前
父節點
當前提交
34e939c2ad

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -277,4 +277,11 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @param endDateTime
      */
     void cuntinueCourseSign(@Param("courseScheduleId")Long courseScheduleId,@Param("startDateTime")Date startDateTime,@Param("endDateTime")Date endDateTime);
+
+    /**
+     * 清除学员签退信息
+     * @param courseId
+     * @param userId
+     */
+    void cleanCourseStudentSignOut(@Param("courseId") Long courseId, @Param("userId") Integer userId);
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -94,4 +94,18 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @param month
 	 */
     void repairStudentAttendance(Integer month);
+
+	/**
+	 * 获取签到数据
+	 * @param courseId
+	 * @param userId
+	 */
+	StudentAttendance findByStatusAndCourseScheduleId(Long courseId, Integer userId);
+
+	/**
+	 * 清除当前学生签退信息
+	 * @param courseId
+	 * @param userId
+	 */
+	void cleanCourseStudentSignOut(Long courseId, Integer userId);
 }

+ 39 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -468,7 +468,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 			studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
 			studentAttendance.setUpdateTime(date);
 		}
-		Date signInTime = studentAttendance.getSignInTime();
+//		Date signInTime = studentAttendance.getSignInTime();
 		//没有签到信息才会生成
 		if(signStatusEnum == SignStatusEnum.SIGN_IN && studentAttendance.getSignInTime() == null){
 			//判断是否在签到时间段内(课程开始前20~结束前)
@@ -490,8 +490,6 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 				courseScheduleDao.update(courseSchedule);
 			}
 		}else if(signStatusEnum == SignStatusEnum.SIGN_OUT){
-			studentAttendance.setStatus(statusEnum);
-			studentAttendance.setSignOutTime(date);
 			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 			String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
@@ -525,30 +523,40 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 					totalMinutes -= firstMinutes;
 					if(totalMinutes > 0){
 						String courseClassDate;
-//						String courseStartDateTime;
+						String courseStartDateTime;
 						String courseEndDateTime;
 						for (int i = 0; i < courseSchedules.size(); i++) {
 							courseClassDate = DateUtil.format(courseSchedules.get(i).getClassDate(), DateUtil.DEFAULT_PATTERN);
-//							courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+							courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 							courseEndDateTime = DateUtil.format(courseSchedules.get(i).getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-//							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 							StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseSchedules.get(i).getId().intValue());
-//							Date signOutTime = date;
-//							if(i < courseSchedules.size() - 1 && date.after(endDateTime)){
-							//不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
-//								signOutTime = endDateTime;
-//							}
+							Date signOutTime = date;
+							if(date.before(startDateTime)){
+								continue;
+							}
+							if(i < courseSchedules.size() - 1 && date.after(endDateTime)){
+								//不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
+								signOutTime = endDateTime;
+							}
 							if(byStatusAndCourseScheduleId != null){
-								byStatusAndCourseScheduleId.setSignOutTime(date);
+								if(byStatusAndCourseScheduleId.getSignOutTime() != null){
+									continue;
+								}
+								if(byStatusAndCourseScheduleId.getSignInTime() != null){
+									startDateTime = null;
+								}
+								byStatusAndCourseScheduleId.setSignInTime(startDateTime);
+								byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
 								byStatusAndCourseScheduleId.setStatus(statusEnum);
 								byStatusAndCourseScheduleId.setUpdateTime(date);
 								studentAttendanceDao.update(byStatusAndCourseScheduleId);
 							}else {
 								byStatusAndCourseScheduleId = new StudentAttendance();
-								byStatusAndCourseScheduleId.setSignOutTime(date);
+								byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
 								byStatusAndCourseScheduleId.setStatus(statusEnum);
-								byStatusAndCourseScheduleId.setSignInTime(signInTime);
+								byStatusAndCourseScheduleId.setSignInTime(startDateTime);
 								byStatusAndCourseScheduleId.setUpdateTime(date);
 								byStatusAndCourseScheduleId.setUserId(userId);
 								byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
@@ -559,12 +567,17 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 								byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
 								studentAttendanceDao.insert(byStatusAndCourseScheduleId);
 							}
-							if(!date.after(endDateTime)){
-								break;
+							if(studentAttendance.getSignOutTime() == null){
+								studentAttendance.setStatus(statusEnum);
+								studentAttendance.setSignOutTime(classEndDateTime);
 							}
 						}
 					}
 				}
+				if(studentAttendance.getSignOutTime() == null){
+					studentAttendance.setStatus(statusEnum);
+					studentAttendance.setSignOutTime(date);
+				}
 			}
 		}
 		studentAttendanceDao.update(studentAttendance);
@@ -666,4 +679,14 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 			}
 		}
 	}
+
+	@Override
+	public StudentAttendance findByStatusAndCourseScheduleId(Long courseId, Integer userId) {
+		return studentAttendanceDao.findByStatusAndCourseScheduleId(userId,courseId.intValue());
+	}
+
+	@Override
+	public void cleanCourseStudentSignOut(Long courseId, Integer userId) {
+		studentAttendanceDao.cleanCourseStudentSignOut(courseId,userId);
+	}
 }

+ 12 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -309,15 +309,13 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		//签退
 		if(SignStatusEnum.SIGN_OUT.equals(signStatus)){
 			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0){
-				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-				Date signInTime = teacherAttendance.getSignInTime();
 				List<CourseSchedule> courseSchedules = new ArrayList<>();
 				CourseSchedule cs = courseSchedule;
 				while (true){
 					//获取当前课程的所有连堂课列表
 					String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
 					String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-					Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+//					Date toDate = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 					cs = courseScheduleDao.queryContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
 					//存在连堂课
 					if(cs != null){
@@ -360,6 +358,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 							if(personalAttendance.getSignInTime() != null){
 								startDateTime = null;
 							}
+							if(personalAttendance.getSignOutTime() != null){
+								continue;
+							}
 							if(date.after(endDateTime)){
 								teacherAttendanceDao.cuntinueCourseSign(courseSchedules.get(i).getId(),startDateTime,signOutTime,1);
 							}else if (date.equals(endDateTime)){
@@ -367,14 +368,20 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 							}else {
 								teacherAttendanceDao.cuntinueCourseSign(courseSchedules.get(i).getId(),startDateTime,signOutTime,0);
 							}
+							if(teacherAttendance.getSignOutTime() == null){
+								teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
+								teacherAttendance.setSignOutTime(classEndDateTime);
+							}
 						}
-						date = classEndDateTime;
 					}
 				}
+				if(teacherAttendance.getSignOutTime() == null){
+					teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
+					teacherAttendance.setSignOutTime(date);
+				}
 			}else {
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
 			}
-			teacherAttendance.setSignOutTime(date);
 			teacherAttendanceDao.update(teacherAttendance);
 		}
 	}

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -149,6 +149,11 @@
 	        where id_ = #{item.id}
 	    </foreach>      
 	</update>
+    <update id="cleanCourseStudentSignOut">
+        UPDATE student_attendance
+        SET sign_out_time_= NULL
+    	WHERE course_schedule_id_=#{courseId} AND user_id_ = #{userId}
+    </update>
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">

+ 36 - 21
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -16,6 +16,7 @@ import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
@@ -242,19 +243,11 @@ public class RoomServiceImpl implements RoomService {
     @Transactional(rollbackFor = Exception.class)
     public void signIn(Long roomId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        String userId = sysUser.getId().toString();
+        Integer userId = sysUser.getId();
         log.info("roomSignIn: roomId={}, userId={}", roomId, userId);
-        Teacher teacher = teacherDao.get(Integer.parseInt(userId));
+        Teacher teacher = teacherDao.get(userId);
         CourseSchedule courseSchedule = courseScheduleDao.get(roomId);
         Date date = new Date();
-        TeacherAttendance attendanceInfo = teacherAttendanceService.findByTeacherAttendanceInfo(roomId, courseSchedule.getActualTeacherId());
-        String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-        String format1 = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-        Date endDateTime = DateUtil.stringToDate(format + " " + format1, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-        //如果
-        if(attendanceInfo != null && attendanceInfo.getSignOutTime() != null && date.before(endDateTime)){
-            teacherAttendanceService.cleanCourseTeacherSignOut(roomId);
-        }
         String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
         if(StringUtils.isEmpty(continueCourseTime)){
             continueCourseTime = "5";
@@ -275,31 +268,53 @@ public class RoomServiceImpl implements RoomService {
         if(signInRoomId == null){
             signInRoomId = roomId;
         }else {
-            if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
-                String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-                String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-                //获取上一次课程
-                CourseSchedule lastCourse = courseScheduleDao.getLastCourse(courseSchedule.getClassGroupId(), classDate + " " + startClassTime, courseSchedule.getActualTeacherId(), continueCourseTime);
+            String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            //获取上一次课程
+            CourseSchedule lastCourse = courseScheduleDao.getLastCourse(courseSchedule.getClassGroupId(), classDate + " " + startClassTime, courseSchedule.getActualTeacherId(), continueCourseTime);
+            if(teacher != null && userId.equals(courseSchedule.getActualTeacherId())){
                 //获取当前课程的签退时间
-                TeacherAttendance teacherAttendance = teacherAttendanceService.findByTeacherAttendanceInfo(lastCourse.getId(),courseSchedule.getActualTeacherId());
+                TeacherAttendance teacherAttendance = teacherAttendanceService.findByTeacherAttendanceInfo(lastCourse.getId(),userId);
                 //如果上次课签退时间和当前签到时间间隔小于等于5分钟,清除上一次课程的教师签退记录
                 Date signOutTime = teacherAttendance.getSignOutTime();
-                log.info("signOutTime: signOutTime={}, date={}", signOutTime, date);
+                log.info("teacherSignOutTime: signOutTime={}, date={}", signOutTime, date);
                 if(signOutTime != null && DateUtil.minutesBetween(signOutTime,date) <= Integer.parseInt(continueCourseTime)){
                     teacherAttendanceService.cleanCourseTeacherSignOut(lastCourse.getId());
                 }else {
                     //如果大于5分钟,不换课堂,对当前课程进行签到
-                    teacherAttendanceService.addTeacherAttendanceRecord(roomId.intValue(),courseSchedule.getActualTeacherId(), SignStatusEnum.SIGN_IN,true);
+                    teacherAttendanceService.addTeacherAttendanceRecord(roomId.intValue(),userId, SignStatusEnum.SIGN_IN,true);
+                }
+            }else{
+                StudentAttendance statusAndCourseScheduleId = studentAttendanceService.findByStatusAndCourseScheduleId(lastCourse.getId(), userId);
+                Date signOutTime = statusAndCourseScheduleId.getSignOutTime();
+                log.info("studentSignOutTime: signOutTime={}, date={}", signOutTime, date);
+                if(signOutTime != null && DateUtil.minutesBetween(signOutTime,date) <= Integer.parseInt(continueCourseTime)){
+                    studentAttendanceService.cleanCourseStudentSignOut(lastCourse.getId(), userId);
+                }else {
+                    //如果大于5分钟,不换课堂,对当前课程进行签到
+                    studentAttendanceService.addStudentAttendanceRecord(signInRoomId.intValue(),userId, StudentAttendanceStatusEnum.NORMAL,SignStatusEnum.SIGN_IN);
                 }
             }
         }
         //如果存在连堂课,并且跨课超过5分钟
         log.info("signInRoomId: signInRoomId={}, userId={}", signInRoomId, userId);
         try {
-            if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
-                teacherAttendanceService.addTeacherAttendanceRecord(signInRoomId.intValue(),courseSchedule.getActualTeacherId(), SignStatusEnum.SIGN_IN,true);
+            String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String format1 = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            Date endDateTime = DateUtil.stringToDate(format + " " + format1, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+            if(teacher != null && userId.equals(courseSchedule.getActualTeacherId())){
+                TeacherAttendance attendanceInfo = teacherAttendanceService.findByTeacherAttendanceInfo(roomId,userId);
+                //如果当前课程签退不为空,并且当前时间小于课程结束时间,那么清除签退时间
+                if(attendanceInfo != null && attendanceInfo.getSignOutTime() != null && date.before(endDateTime)){
+                    teacherAttendanceService.cleanCourseTeacherSignOut(roomId);
+                }
+                teacherAttendanceService.addTeacherAttendanceRecord(signInRoomId.intValue(),userId, SignStatusEnum.SIGN_IN,true);
             }else {
-                studentAttendanceService.addStudentAttendanceRecord(signInRoomId.intValue(),Integer.parseInt(userId), StudentAttendanceStatusEnum.NORMAL,SignStatusEnum.SIGN_IN);
+                StudentAttendance studentAttendance = studentAttendanceService.findByStatusAndCourseScheduleId(roomId, userId);
+                if(studentAttendance != null && studentAttendance.getSignOutTime() != null && date.before(endDateTime)){
+                    studentAttendanceService.cleanCourseStudentSignOut(roomId, userId);
+                }
+                studentAttendanceService.addStudentAttendanceRecord(signInRoomId.intValue(),userId, StudentAttendanceStatusEnum.NORMAL,SignStatusEnum.SIGN_IN);
             }
         }catch (Exception e){
             e.printStackTrace();