Jelajahi Sumber

课时调整及交换

Joburgess 5 tahun lalu
induk
melakukan
c994bb95df

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

@@ -71,4 +71,27 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     List<CourseSchedule> findTeacherCoursesInDates(@Param("dates") List<Date> dates,
                                                    @Param("teacherId") Long teacherId);
+
+    /**
+     * @Author: Joburgess
+     * @Date: 2019/9/24
+     * 根据日期获取课程
+     */
+    List<CourseSchedule> findCoursesByDates(@Param("dates") List<Date> dates);
+
+    /**
+     * @Author: Joburgess
+     * @Date: 2019/9/24
+     * 获取在指定时间段内存在重复的课程
+     */
+    List<CourseSchedule> findOverLapCoursesInDay(@Param("dates") List<Date> dates,
+                                                 @Param("startClassTime") Date startClassTime,
+                                                 @Param("endClassTime") Date endClassTime);
+
+    /**
+     * @Author: Joburgess
+     * @Date: 2019/9/24
+     * 根据id批量获取课程
+     */
+    List<CourseSchedule> findCourseSchedulesByIds(@Param("ids") Long[] ids);
 }

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -51,5 +51,12 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
      * @Date: 2019/9/23
      * 课时调整
      */
-    int classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto);
+    void classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto);
+
+    /**
+     * @Author: Joburgess
+     * @Date: 2019/9/24
+     * 课程交换
+     */
+    void courseSwap(Long courseScheduleId1,Long courseScheduleId2);
 }

+ 90 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -13,8 +13,10 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 
 import com.ym.mec.common.utils.DateUtils;
 import io.swagger.models.auth.In;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -132,26 +134,104 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		return map;
 	}
 
+	@Transactional(rollbackFor = Exception.class)
 	@Override
-	public int classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto) {
+	public void classStartDateAdjust(ClassDateAdjustDto classDateAdjustDto) {
 		//单次调整课时
 		if(null==classDateAdjustDto.getAdjustStartTime()&&null==classDateAdjustDto.getAdjustEndTime()){
-			if(courseScheduleDao.countTeacherCourseInOnDayRepeats(classDateAdjustDto)<=0){
+			ArrayList<Date> dates = new ArrayList<>();
+			dates.add(classDateAdjustDto.getClassDate());
+			List<CourseSchedule> coursesByDates = courseScheduleDao.findOverLapCoursesInDay(dates,classDateAdjustDto.getStartClassTime(),classDateAdjustDto.getEndClassTime());
+			//判断是否存在同时间上课的班级
+			if(null==coursesByDates||coursesByDates.size()<=0){
 				courseScheduleDao.update(classDateAdjustDto);
 			}else{
-				//存在时间重叠,需要前端重新调整
-				throw new BizException("所选教师在当天课程安排上存在重叠!");
+				coursesByDates.forEach(courseSchedule -> {
+					if(courseSchedule.getTeacherId().equals(classDateAdjustDto.getTeacherId())){
+						//存在时间重叠,需要前端重新调整
+						throw new BizException("所选教师在当天课程安排上存在重叠!");
+					}
+				});
+				List<Integer> repeatClassGroupIds = coursesByDates.stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
+				checkStudentIsRepeat(repeatClassGroupIds);
+				courseScheduleDao.update(classDateAdjustDto);
 			}
 		}else{
 			//根据时间段调整课时
 			List<Date> dates= DateUtils.getWeekDays(classDateAdjustDto.getAdjustStartTime(),classDateAdjustDto.getAdjustEndTime(),classDateAdjustDto.getWeekNum());
-			List<CourseSchedule> teacherCoursesInDates = courseScheduleDao.findTeacherCoursesInDates(dates, classDateAdjustDto.getTeacherId());
-			teacherCoursesInDates.forEach(courseSchedule -> {
-//				if(courseSchedule.getStartClassTime()>classDateAdjustDto.getEndClassTime()
-//						||)
-			});
+			List<CourseSchedule> coursesByDates = courseScheduleDao.findOverLapCoursesInDay(dates,classDateAdjustDto.getStartClassTime(),classDateAdjustDto.getEndClassTime());
+			//判断是否存在同时间上课的班级
+			if(null==coursesByDates||coursesByDates.size()<=0){
+				courseScheduleDao.update(classDateAdjustDto);
+			}else{
+				//判断教师是否在时间安排上存在冲突
+				List<CourseSchedule> teacherCoursesInDates = courseScheduleDao.findTeacherCoursesInDates(dates, classDateAdjustDto.getTeacherId());
+				teacherCoursesInDates.forEach(courseSchedule -> {
+					boolean isDuplication=(courseSchedule.getStartClassTime().after(classDateAdjustDto.getStartClassTime())
+							&&courseSchedule.getStartClassTime().before(classDateAdjustDto.getEndClassTime()))
+							||(classDateAdjustDto.getStartClassTime().after(courseSchedule.getStartClassTime())
+							&&classDateAdjustDto.getStartClassTime().before(courseSchedule.getEndClassTime()));
+					if(isDuplication){
+						throw new BizException("在所选时段内教师上课时间存在重复!");
+					}
+
+				});
+				//判断学生在时间安排上是否存在冲突
+				Map<Date, List<CourseSchedule>> collect = coursesByDates.stream().collect(Collectors.groupingBy(CourseSchedule::getClassDate));
+				for(Date keyDate:collect.keySet()){
+					List<Integer> repeatClassGroupIds = collect.get(keyDate).stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
+					checkStudentIsRepeat(repeatClassGroupIds);
+				}
+				createNewCourseByAdjust(dates,classDateAdjustDto);
+			}
+		}
+	}
+
+	@Transactional(rollbackFor = Exception.class)
+	@Override
+	public void courseSwap(Long courseScheduleId1, Long courseScheduleId2) {
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findCourseSchedulesByIds(new Long[]{courseScheduleId1, courseScheduleId2});
+		CourseSchedule temp=new CourseSchedule();
+		BeanUtils.copyProperties(courseSchedules.get(0),temp);
+		courseSchedules.get(0).setClassDate(courseSchedules.get(1).getClassDate());
+		courseSchedules.get(0).setStartClassTime(courseSchedules.get(1).getStartClassTime());
+		courseSchedules.get(0).setEndClassTime(courseSchedules.get(1).getEndClassTime());
+		courseSchedules.get(1).setClassDate(temp.getClassDate());
+		courseSchedules.get(1).setStartClassTime(temp.getStartClassTime());
+		courseSchedules.get(1).setEndClassTime(temp.getEndClassTime());
+		courseScheduleDao.update(courseSchedules.get(0));
+		courseScheduleDao.update(courseSchedules.get(1));
+	}
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/24
+	 * 检测学生是否存在重复
+	 */
+	private void checkStudentIsRepeat(List<Integer> studentIds){
+		Integer[] counts=courseScheduleDao.countStudentInClass(studentIds);
+		for (Integer i:counts){
+			if (i>ParamEnum.ONE.getCode()){
+				throw new BizException("所选课程安排日期有学生重复!");
+			}
+		}
+	}
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/24
+	 * 根据课时调整信息增加新课程
+	 */
+	private void createNewCourseByAdjust(List<Date> dates,ClassDateAdjustDto classDateAdjustDto){
+		List<CourseSchedule> courseSchedules=new ArrayList<>();
+		courseScheduleDao.delete(classDateAdjustDto.getId());
+		for (Date date:dates){
+			CourseSchedule courseSchedule=new CourseSchedule();
+			BeanUtils.copyProperties(classDateAdjustDto,courseSchedule);
+			courseSchedule.setClassDate(date);
+			courseSchedules.add(courseSchedule);
 		}
-		return 0;
+		courseScheduleDao.batchAddCourseSchedules(courseSchedules);
 	}
 
 }

+ 40 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -53,10 +53,10 @@
 
     <insert id="batchAddCourseSchedules" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
         INSERT INTO course_schedule
-        (id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,teacher_id_,actual_teacher_id_,create_time_,update_time_,current_class_times_)
+        (class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,teacher_id_,actual_teacher_id_,create_time_,update_time_,current_class_times_)
         VALUE
         <foreach collection="list" item="course" separator=",">
-            (#{course.id},#{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},#{course.actualTeacherId},now(),now(),#{course.currentClassTimes})
+            (#{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},#{course.actualTeacherId},now(),now(),#{course.currentClassTimes})
         </foreach>
     </insert>
 
@@ -264,4 +264,42 @@
                 #{date}
             </foreach>
     </select>
+    <select id="findCoursesByDates" resultMap="CourseSchedule">
+        SELECT
+        *
+        FROM
+        course_schedule cs
+        WHERE
+        cs.class_date_ IN
+        <foreach collection="dates" item="date" open="(" close=")" separator=",">
+            DATE_FORMAT(#{date},'%Y-%m-%d')
+        </foreach>
+    </select>
+
+    <select id="findOverLapCoursesInDay" resultMap="CourseSchedule">
+        SELECT
+        *
+        FROM
+        course_schedule cs
+        WHERE
+        cs.class_date_ IN
+        <foreach collection="list" item="date" open="(" close=")" separator=",">
+            DATE_FORMAT(#{date},'%Y-%m-%d')
+        </foreach>
+        AND (
+        DATE_FORMAT(cs.start_class_time_,"%H:%i:%s") &gt; DATE_FORMAT(#{endClassTime}, '%H:%i:%s' ) OR DATE_FORMAT(cs.end_class_time_,"%H:%i:%s") &lt; DATE_FORMAT( #{endClassTime}, '%H:%i:%s' )
+        )=0
+    </select>
+
+    <select id="findCourseSchedulesByIds" resultMap="CourseSchedule">
+        SELECT
+        *
+        FROM
+        course_schedule cs
+        WHERE
+        cs.id_ IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 41 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java

@@ -0,0 +1,41 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/24
+ */
+@RequestMapping("studentCourseSchedule")
+@Api(tags = "课程计划服务")
+@RestController
+public class StudentCourseScheduleController extends BaseController {
+
+    @Autowired
+    private CourseScheduleService scheduleService;
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+
+    @ApiOperation(value = "课时调整")
+    @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object classStartDateAdjust(@RequestBody ClassDateAdjustDto classDateAdjustDto){
+        scheduleService.classStartDateAdjust(classDateAdjustDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "课时交换")
+    @GetMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
+        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
+        return succeed();
+    }
+
+}

+ 16 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -8,6 +9,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -85,4 +87,18 @@ public class CourseScheduleController extends BaseController {
         return succeed(studentAttendanceService.getCurrentCourseStudents(queryInfo));
     }
 
+    @ApiOperation(value = "课时调整")
+    @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object classStartDateAdjust(@RequestBody ClassDateAdjustDto classDateAdjustDto){
+        scheduleService.classStartDateAdjust(classDateAdjustDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "课时交换")
+    @GetMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
+        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
+        return succeed();
+    }
+
 }