Joburgess 5 年之前
父節點
當前提交
d2f3cd56bf

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -424,4 +424,15 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     List<String> queryMusicGroupIds(Map<String, Object> params);
+
+    /**
+     * @describe 获取时间段内的课程
+     * @author Joburgess
+     * @date 2019/10/31
+     * @param startTime: 开始时间
+     * @param endTime: 结束时间
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
+    List<CourseSchedule> findByDateZone(@Param("startTime") Date startTime,
+                                        @Param("endTime") Date endTime);
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -140,6 +140,24 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
     void courseSwapWithDay(Date day1,Date day2);
 
     /**
+     * @describe 检测数据库不存在的课程是否存在错误
+     * @author Joburgess
+     * @date 2019/10/31
+     * @param courseSchedules: 课程列表
+     * @return void
+     */
+    void checkNewCourseSchedules(List<CourseSchedule> courseSchedules);
+
+    /**
+     * @describe 检测数据库中存在的课程调整后是否存在错误
+     * @author Joburgess
+     * @date 2019/10/31
+     * @param courseSchedules: 课程列表
+     * @return void
+     */
+    void checkOldCourseSchedules(List<CourseSchedule> courseSchedules);
+
+    /**
      * 获取班级未开始的课程计划
      *
      * @param classGroupTeacherMapperList

+ 100 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -17,6 +17,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
+import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -126,7 +127,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(Objects.isNull(courseSchedules)&&courseSchedules.size()<=0){
 			throw new BizException("参数错误!");
 		}
-		checkCourseSchedule(courseSchedules);
+		checkNewCourseSchedules(courseSchedules);
         createCourseScheduleName(courseSchedules);
 		courseScheduleDao.batchAddCourseSchedules(courseSchedules);
 	}
@@ -250,6 +251,104 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		return teacherCourseSchedulesWithDate;
 	}
 
+	@Override
+	public void checkNewCourseSchedules(List<CourseSchedule> courseSchedules){
+		//第一节课
+		CourseSchedule firstCourseSchedule = courseSchedules.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+		//最后一节课
+		CourseSchedule latestCourseSchedule = courseSchedules.stream().max(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+		//获取第一节课和最后一节课所包含的时间段内已存在的课程
+		List<CourseSchedule> existCourseSchedules = courseScheduleDao.findByDateZone(firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+		//只需要调整课程信息的课程编号列表
+		List<Long> updateCourseScheduleIds = courseSchedules
+				.stream()
+				.filter(courseSchedule -> Objects.nonNull(courseSchedule.getId()))
+				.map(CourseSchedule::getId)
+				.collect(Collectors.toList());
+		//排除只需调整的课程
+		existCourseSchedules=existCourseSchedules.stream()
+				.filter(courseSchedule -> !updateCourseScheduleIds.contains(courseSchedule.getId()))
+				.collect(Collectors.toList());
+		//合并新课程和已存在的课程
+		List<CourseSchedule> allCourseSchedules;
+		if(!CollectionUtils.isEmpty(existCourseSchedules)){
+			allCourseSchedules = ListUtils.sum(courseSchedules, existCourseSchedules);
+		}else{
+			allCourseSchedules = courseSchedules;
+		}
+		//所有课程的班级编号
+		List<Integer> classGroupIds = courseSchedules
+				.stream()
+				.map(CourseSchedule::getClassGroupId)
+				.distinct()
+				.collect(Collectors.toList());
+		//班级与学生的关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperDao.findByClassGroups(classGroupIds);
+		Map<Integer, List<ClassGroupStudentMapper>> classGroupStudentsMap = classGroupStudentMappers
+				.stream()
+				.collect(Collectors.groupingBy(ClassGroupStudentMapper::getClassGroupId));
+
+		//将课程计划按照开课时间排序
+		allCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+		if(allCourseSchedules.size()>1){
+			for (int i=0;i<allCourseSchedules.size()-1;i++){
+				//当前课程
+				CourseSchedule preCourseSchedule = allCourseSchedules.get(i);
+				//后面一节课程
+				CourseSchedule backCourseSchedule = allCourseSchedules.get(i+1);
+				//判断存在时间重叠的课程
+				if(backCourseSchedule.getStartClassTime().before(preCourseSchedule.getEndClassTime())){
+					//提示信息
+					StringBuffer errInfo = new StringBuffer("在");
+					errInfo.append(DateUtil.dateToString(preCourseSchedule.getStartClassTime(),DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT));
+					errInfo.append("至");
+					errInfo.append(DateUtil.dateToString(backCourseSchedule.getEndClassTime(),DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT));
+					errInfo.append("时间段内");
+					//如果存在时间重叠,则需要判断前后两节课的教师和学生是否存在冲突
+					//教师冲突检测
+					if(Objects.nonNull(preCourseSchedule.getActualTeacherId())
+							&&preCourseSchedule.getActualTeacherId().equals(backCourseSchedule.getActualTeacherId())){
+						errInfo.append("安排的教师有课程冲突");
+						throw new BizException(errInfo.toString());
+					}
+					//学生冲突检测
+					if(preCourseSchedule.getClassGroupId().equals(backCourseSchedule.getClassGroupId())){
+						//如果班级相同,则学生肯定存在冲突
+						errInfo.append("安排的课程存在学生冲突");
+						throw new BizException(errInfo.toString());
+					}
+					//如果班级不同,则需要检测两个班级是否存在重复的学生
+					List<ClassGroupStudentMapper> preClassGroupStudents=classGroupStudentsMap.get(preCourseSchedule.getClassGroupId());
+					List<ClassGroupStudentMapper> backClassGroupStudents=classGroupStudentsMap.get(backCourseSchedule.getClassGroupId());
+					//如果有一个存在没有学生的班级则不存在冲突
+					if(CollectionUtils.isEmpty(preClassGroupStudents)||CollectionUtils.isEmpty(backClassGroupStudents)){
+						continue;
+					}
+					//当前课程所在班级的学生编号列表
+					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)){
+						errInfo.append("安排的课程存在学生冲突");
+						throw new BizException(errInfo.toString());
+					}
+				}
+			}
+		}
+	}
+
+	@Override
+	public void checkOldCourseSchedules(List<CourseSchedule> courseSchedules) {
+
+	}
+
 	/**
 	 * 判断课程安排中是否存在冲突
 	 * 计算课程课次
@@ -720,11 +819,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			String classNamesStr=StringUtils.join(classGroupNamesByClassGroups,",");
 			throw new BizException(classNamesStr+"班级未排课");
 		}
-//		for (Integer key:classCourseNumMap.keySet()){
-//			if(classCourseNumMap.get(key)<=0){
-//				throw new BizException("存在未排课的班级");
-//			}
-//		}
 	}
 
 	@Override

+ 4 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -11,8 +11,6 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupMember;
-import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -213,9 +211,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		//创建融云班级群
 		// 指导老师加入群组
-		ImGroupMember[] imGroupMembers = { new ImGroupMember(vipGroup.getVipGroupApplyBaseInfo().getUserId().toString())};
+//		ImGroupMember[] imGroupMembers = { new ImGroupMember(vipGroup.getVipGroupApplyBaseInfo().getUserId().toString())};
 		// 创建群组
-		imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+//		imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
 
 		//创建班级老师关联记录
 		ClassGroupTeacherMapper classGroupTeacherMapper=new ClassGroupTeacherMapper();
@@ -276,7 +274,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(CollectionUtils.isEmpty(courseSchedules)){
 			return;
 		}
-		
+
 	}
 
 	@Override
@@ -563,7 +561,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 						teacherOnlineSalary=((VipGroupApplyBaseInfoDto) vipGroup).getOnlineTeacherSalary();
 					}
 
-					if(!Objects.isNull(teacherOnlineSalary)){
+					if(Objects.isNull(teacherOnlineSalary)){
 						teacherOnlineSalary=teacherDefaultVipGroupSalary.getOnlineClassesSalary();
 					}
 

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -1055,4 +1055,29 @@
             AND DATE_FORMAT( #{startTime}, '%H:%i:%S' ) &lt;= DATE_FORMAT( cs.end_class_time_, '%H:%i:%S' )
             AND DATE_FORMAT( #{endTime}, '%H:%i:%S' ) &gt;= DATE_FORMAT( cs.start_class_time_, '%H:%i:%S' )
     </select>
+    <select id="findByDateZone" resultMap="CourseSchedule">
+        SELECT
+            cs.id_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.subsidy_,
+            cs.class_date_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.teacher_id_,
+            csts.user_id_ actual_teacher_id_,
+            cs.create_time_,
+            cs.update_time_,
+            cs.teach_mode_,
+            cs.type_,
+            cs.name_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.schoole_id_
+        FROM
+            course_schedule cs
+            LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_
+            WHERE cs.class_date_ BETWEEN DATE_FORMAT(#{startTime},'%Y%m%d') AND DATE_FORMAT(#{endTime},'%Y%m%d')
+
+    </select>
 </mapper>

+ 10 - 0
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -867,6 +867,16 @@ public class DateUtil {
 	}
 
 	/**
+	 * 时间转字符串
+	 * @param date
+	 * @return
+	 */
+	public static String dateToString(Date date, String format) {
+		SimpleDateFormat df = new SimpleDateFormat(format);
+		return df.format(date);
+	}
+
+	/**
 	 * @describe 获取时间段内对应星期数的集合
 	 * @author Joburgess
 	 * @date 2019/10/25