|
@@ -114,9 +114,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void deleteCourseSchedules(List<Long> courseScheduleIds) {
|
|
|
courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
|
|
|
- courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
|
|
|
- courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
|
|
|
- teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
|
|
|
+ courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
|
|
|
+ courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
|
|
|
+ teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -524,8 +524,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public List<Long> checkSnapCourseShchedules(List<CourseSchedule> courseSchedules) {
|
|
|
List<Long> courseScheduleIds = new ArrayList<>();
|
|
|
+ List<CourseScheduleStudentDto> courseScheduleStudents = new ArrayList<>();
|
|
|
if(CollectionUtils.isEmpty(courseSchedules)){
|
|
|
return courseScheduleIds;
|
|
|
}
|
|
@@ -555,6 +557,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
existCourseSchedules=existCourseSchedules.stream()
|
|
|
.filter(courseSchedule -> !updateCourseScheduleIds.contains(courseSchedule.getId()))
|
|
|
.collect(Collectors.toList());
|
|
|
+ if(existCourseSchedules ==null || existCourseSchedules.size()==0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
//新课程对应的班级编号列表
|
|
|
List<Integer> newCourseScheduleClassGroupIds = courseSchedules
|
|
|
.stream()
|
|
@@ -598,109 +603,89 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
Map<Integer, IntegerAndIntegerListDto> classGroupTeachingTeacherMap = classGroupAndUserIdsMap.stream()
|
|
|
.collect(Collectors.toMap(IntegerAndIntegerListDto::getId, integerAndIntegerListDto -> integerAndIntegerListDto));
|
|
|
|
|
|
- //将课程计划按照开课时间排序
|
|
|
- allCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
|
- if(allCourseSchedules.size()>1){
|
|
|
- //记录连续冲突的次数
|
|
|
- Integer repeatTimes=1;
|
|
|
- for (int i=1;i<allCourseSchedules.size();i++){
|
|
|
- for(int j=1;j<=repeatTimes;j++){
|
|
|
- //当前课程
|
|
|
- CourseSchedule preCourseSchedule = allCourseSchedules.get(i-j);
|
|
|
- //后面一节课程
|
|
|
- CourseSchedule backCourseSchedule = allCourseSchedules.get(i);
|
|
|
- //判断前后两节课是否存在冲突
|
|
|
- if(preCourseSchedule.getEndClassTime().before(backCourseSchedule.getStartClassTime())){
|
|
|
- repeatTimes=j;
|
|
|
- continue;
|
|
|
- }
|
|
|
- repeatTimes+=1;
|
|
|
- if(existCourseScheduleIds.contains(preCourseSchedule.getId())
|
|
|
- &&existCourseScheduleIds.contains(backCourseSchedule.getId())){
|
|
|
- if(j==repeatTimes){
|
|
|
- repeatTimes+=1;
|
|
|
- }
|
|
|
- continue;
|
|
|
- }
|
|
|
+ existCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
|
+ courseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
|
|
|
|
- //教师冲突检测
|
|
|
- if(Objects.isNull(preCourseSchedule.getId())){
|
|
|
- IntegerAndIntegerListDto integerAndIntegerListDto = classGroupTeachingTeacherMap.get(preCourseSchedule.getClassGroupId());
|
|
|
- if(Objects.nonNull(integerAndIntegerListDto)){
|
|
|
- preCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
|
|
|
- }
|
|
|
- }else if(existCourseScheduleIds.contains(preCourseSchedule.getId())){
|
|
|
- IntegerAndIntegerListDto integerAndIntegerListDto = courseScheduleTeacherMap.get(preCourseSchedule.getId());
|
|
|
- if(Objects.nonNull(integerAndIntegerListDto)){
|
|
|
- preCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
|
|
|
- }
|
|
|
- }
|
|
|
- if(Objects.isNull(backCourseSchedule.getId())){
|
|
|
- IntegerAndIntegerListDto integerAndIntegerListDto = classGroupTeachingTeacherMap.get(backCourseSchedule.getClassGroupId());
|
|
|
- if(Objects.nonNull(integerAndIntegerListDto)){
|
|
|
- backCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
|
|
|
- }
|
|
|
- }else if(existCourseScheduleIds.contains(backCourseSchedule.getId())){
|
|
|
- IntegerAndIntegerListDto integerAndIntegerListDto = courseScheduleTeacherMap.get(backCourseSchedule.getId());
|
|
|
- if(Objects.nonNull(integerAndIntegerListDto)){
|
|
|
- backCourseSchedule.setTeachingTeacherIdList(integerAndIntegerListDto.getIds());
|
|
|
- }
|
|
|
- }
|
|
|
- boolean isRepeat = false;
|
|
|
- if(!CollectionUtils.isEmpty(preCourseSchedule.getTeachingTeacherIdList())
|
|
|
- &&!CollectionUtils.isEmpty(backCourseSchedule.getTeachingTeacherIdList())){
|
|
|
- List<Integer> repeatIds = preCourseSchedule.getTeachingTeacherIdList()
|
|
|
- .stream().filter(backCourseSchedule.getTeachingTeacherIdList()::contains)
|
|
|
- .collect(Collectors.toList());
|
|
|
- if(!CollectionUtils.isEmpty(repeatIds)){
|
|
|
- isRepeat = true;
|
|
|
- }
|
|
|
- }
|
|
|
- //学生冲突检测
|
|
|
- if(preCourseSchedule.getClassGroupId().equals(backCourseSchedule.getClassGroupId())){
|
|
|
- //如果班级相同,则学生肯定存在冲突
|
|
|
- isRepeat = true;
|
|
|
- }
|
|
|
- //如果班级不同,则需要检测两个班级是否存在重复的学生
|
|
|
- List<ClassGroupStudentMapper> preClassGroupStudents=classGroupStudentsMap.get(preCourseSchedule.getClassGroupId());
|
|
|
- List<ClassGroupStudentMapper> backClassGroupStudents=classGroupStudentsMap.get(backCourseSchedule.getClassGroupId());
|
|
|
- //当前课程所在班级的学生编号列表
|
|
|
- List<Integer> preClassGroupStudentIds = preClassGroupStudents.stream()
|
|
|
- .map(ClassGroupStudentMapper::getUserId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- //后面一节课程所在班级的学生编号列表
|
|
|
- List<Integer> backClassGroupStudentIds = backClassGroupStudents.stream()
|
|
|
- .map(ClassGroupStudentMapper::getUserId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- List<Integer> repeatStudentIds = preClassGroupStudentIds.stream()
|
|
|
- .filter(backClassGroupStudentIds::contains)
|
|
|
+ newNode:
|
|
|
+ for (CourseSchedule newCourseSchedule : courseSchedules) {
|
|
|
+ exitNode:
|
|
|
+ for (CourseSchedule existCourseSchedule : existCourseSchedules) {
|
|
|
+ if(newCourseSchedule.getEndClassTime().before(existCourseSchedule.getStartClassTime())){
|
|
|
+ continue newNode;
|
|
|
+ }
|
|
|
+ if(existCourseSchedule.getEndClassTime().before(newCourseSchedule.getStartClassTime())){
|
|
|
+ continue exitNode;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean isTeacherRepeat = false;
|
|
|
+ boolean isStudentRepeat = false;
|
|
|
+ //检测老师冲突
|
|
|
+ existCourseSchedule.setTeachingTeacherIdList(courseScheduleTeacherMap.get(existCourseSchedule.getId()).getIds());
|
|
|
+ newCourseSchedule.setTeachingTeacherIdList(classGroupTeachingTeacherMap.get(newCourseSchedule.getClassGroupId()).getIds());
|
|
|
+
|
|
|
+ if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())
|
|
|
+ &&!CollectionUtils.isEmpty(existCourseSchedule.getTeachingTeacherIdList())){
|
|
|
+ List<Integer> repeatIds = newCourseSchedule.getTeachingTeacherIdList()
|
|
|
+ .stream().filter(existCourseSchedule.getTeachingTeacherIdList()::contains)
|
|
|
.collect(Collectors.toList());
|
|
|
- if(!CollectionUtils.isEmpty(repeatStudentIds)){
|
|
|
- isRepeat = true;
|
|
|
+ if(!CollectionUtils.isEmpty(repeatIds)){
|
|
|
+ isTeacherRepeat = true;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if(isRepeat){
|
|
|
- if(preCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())
|
|
|
- &&backCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())){
|
|
|
- throw new BizException("教师冲突");
|
|
|
- }else if(preCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())
|
|
|
- &&backCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.VIP.getCode())){
|
|
|
- throw new BizException("教师冲突");
|
|
|
- }else if(preCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.VIP.getCode())
|
|
|
- &&backCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())){
|
|
|
- throw new BizException("教师冲突");
|
|
|
- }else{
|
|
|
- if(!preCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())
|
|
|
- &&preCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.VIP.getCode())){
|
|
|
- courseScheduleIds.add(preCourseSchedule.getId());
|
|
|
- }
|
|
|
- if(!backCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())
|
|
|
- &&backCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.VIP.getCode())){
|
|
|
- courseScheduleIds.add(backCourseSchedule.getId());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ //学生冲突检测
|
|
|
+ if(newCourseSchedule.getClassGroupId().equals(existCourseSchedule.getClassGroupId())){
|
|
|
+ //如果班级相同,则学生肯定存在冲突
|
|
|
+ isTeacherRepeat = true;
|
|
|
+ }
|
|
|
+ //如果班级不同,则需要检测两个班级是否存在重复的学生
|
|
|
+ List<ClassGroupStudentMapper> preClassGroupStudents=classGroupStudentsMap.get(newCourseSchedule.getClassGroupId());
|
|
|
+ List<ClassGroupStudentMapper> backClassGroupStudents=classGroupStudentsMap.get(existCourseSchedule.getClassGroupId());
|
|
|
+ //当前课程所在班级的学生编号列表
|
|
|
+ List<Integer> preClassGroupStudentIds = preClassGroupStudents.stream()
|
|
|
+ .map(ClassGroupStudentMapper::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ //后面一节课程所在班级的学生编号列表
|
|
|
+ List<Integer> backClassGroupStudentIds = backClassGroupStudents.stream()
|
|
|
+ .map(ClassGroupStudentMapper::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<Integer> repeatStudentIds = preClassGroupStudentIds.stream()
|
|
|
+ .filter(backClassGroupStudentIds::contains)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if(!CollectionUtils.isEmpty(repeatStudentIds)){
|
|
|
+ isStudentRepeat = true;
|
|
|
}
|
|
|
+ if(!isTeacherRepeat && !isStudentRepeat){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(existCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.SNAP.getCode())||existCourseSchedule.getClassGroupType().equals(ClassGroupTypeEnum.VIP.getCode())){
|
|
|
+ throw new BizException(courseCheckInfo(newCourseSchedule,existCourseSchedule,existCourseScheduleIds,1));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isTeacherRepeat){
|
|
|
+ courseScheduleIds.add(existCourseSchedule.getId());
|
|
|
+ }
|
|
|
+ if(isStudentRepeat){
|
|
|
+ CourseScheduleStudentDto courseScheduleStudentDto = new CourseScheduleStudentDto();
|
|
|
+ courseScheduleStudentDto.setId(existCourseSchedule.getId());
|
|
|
+ courseScheduleStudentDto.setStudentIds(repeatStudentIds);
|
|
|
+ courseScheduleStudents.add(courseScheduleStudentDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //老师冲突删除课程课程
|
|
|
+ if(courseScheduleIds.size()>0){
|
|
|
+ courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
|
|
|
+ courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
|
|
|
+ teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
|
|
|
+ courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
|
|
|
+ }
|
|
|
+ //学生冲突删除学生课程
|
|
|
+ if(courseScheduleStudents.size()>0){
|
|
|
+ for (CourseScheduleStudentDto courseScheduleStudent : courseScheduleStudents) {
|
|
|
+ courseScheduleStudentPaymentDao.deleteStudentCourseScheduleByUserId(courseScheduleStudent.getId(),courseScheduleStudent.getStudentIds());
|
|
|
}
|
|
|
}
|
|
|
return courseScheduleIds;
|
|
@@ -1306,7 +1291,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
for (StudentAttendance studentAttendance : studentAttendanceList) {
|
|
|
studentAttendance.setStatus(StudentAttendanceStatusEnum.TRUANT);
|
|
|
studentAttendance.setRemark("课程已结束,自动补旷课");
|
|
|
- studentAttendance.setCurrentClassTimes(studentAttendance.getCurrentClassTimes() + 1);
|
|
|
+ if(Objects.isNull(studentAttendance.getCurrentClassTimes())){
|
|
|
+ studentAttendance.setCurrentClassTimes(1);
|
|
|
+ }else{
|
|
|
+ studentAttendance.setCurrentClassTimes(studentAttendance.getCurrentClassTimes() + 1);
|
|
|
+ }
|
|
|
studentAttendance.setCreateTime(date);
|
|
|
}
|
|
|
|