Browse Source

1、乐团课新增排课教师课酬计算逻辑调整
2、陪练课接口
3、陪练课指派教师广东分部特殊处理

Joburgess 5 years ago
parent
commit
1147dcd7c7

+ 219 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -186,7 +186,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         calendar.set(Calendar.HOUR_OF_DAY, 0);
         calendar.set(Calendar.MINUTE, 0);
         calendar.set(Calendar.SECOND, 0);
-        List<Integer> includeTeacherIds=new ArrayList<>();
+        List<Integer> firstTeacherIds=new ArrayList<>();
+        List<Integer> secondTeacherIds=new ArrayList<>();
         while (calendar.getTime().before(activityEndDate)){
             calendar.add(Calendar.DATE,1);
             Date applyStartDay = calendar.getTime();
@@ -195,14 +196,18 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if(applyEndDay.after(activityEndDate)){
                 applyEndDay=activityEndDate;
             }
+
             boolean excludeFirstTime=practiceGroup.getFirstCourseTime().before(applyStartDay)||(practiceGroup.getFirstCourseTime().after(applyEndDay)&&!DateUtil.isSameDay(practiceGroup.getFirstCourseTime(),applyEndDay));
             boolean excludeSecondTime=practiceGroup.getSecondCourseTime().before(applyStartDay)||(practiceGroup.getSecondCourseTime().after(applyEndDay)&&!DateUtil.isSameDay(practiceGroup.getFirstCourseTime(),applyEndDay));
             if(excludeFirstTime&&excludeSecondTime){
                 continue;
             }
 
+            Date firstMonday=DateUtil.getWeekDayWithDate(applyStartDay,Calendar.MONDAY);
+            Date secondMonday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.MONDAY);
+            Date secondSunday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.SUNDAY);
 
-            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, applyStartDay, applyEndDay);
+            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, firstMonday, secondSunday);
 
             Date firstClassEndTime = DateUtil.addMinutes(practiceGroup.getFirstCourseTime(), practiceCourseMinutes);
             Date secondClassEndTime = DateUtil.addMinutes(practiceGroup.getSecondCourseTime(), practiceCourseMinutes);
@@ -211,20 +216,73 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             for (Integer teacherId : teacherIds) {
                 List<CourseSchedule> teacherCourses = teacherCoursesMap.get(teacherId);
                 if(CollectionUtils.isEmpty(teacherCourses)){
-                    includeTeacherIds.add(teacherId);
+                    if(!excludeFirstTime){
+                        firstTeacherIds.add(teacherId);
+                    }
+                    if(!excludeSecondTime){
+                        secondTeacherIds.add(teacherId);
+                    }
                     continue;
                 }
 
-                Map<GroupType, Long> groupTypeCountMap = teacherCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
-                if(Objects.nonNull(groupTypeCountMap.get(GroupType.PRACTICE))&&groupTypeCountMap.get(GroupType.PRACTICE)>80){
+                List<CourseSchedule> firstWeekCourses=new ArrayList<>();
+                List<CourseSchedule> secondWeekCourses=new ArrayList<>();
+                List<CourseSchedule> applyDateRangeCourses=new ArrayList<>();
+                for (CourseSchedule teacherCours : teacherCourses) {
+                    if(teacherCours.getClassDate().before(secondMonday)){
+                        firstWeekCourses.add(teacherCours);
+                    }else{
+                        secondWeekCourses.add(teacherCours);
+                    }
+                    if(!teacherCours.getClassDate().before(applyStartDay)
+                            &&(teacherCours.getClassDate().before(applyEndDay)||DateUtil.isSameDay(teacherCours.getClassDate(),applyEndDay))){
+                        applyDateRangeCourses.add(teacherCours);
+                    }
+                }
+
+                boolean firstWeekEnableApply=true;
+                boolean secondWeekEnableApply=true;
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountFirstMap = firstWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountFirstMap.get(GroupType.PRACTICE))&&groupTypeCountFirstMap.get(GroupType.PRACTICE)>80){
+                        firstWeekEnableApply=false;
+                    }
+                }
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountSecondMap = secondWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountSecondMap.get(GroupType.PRACTICE))&&groupTypeCountSecondMap.get(GroupType.PRACTICE)>80){
+                        secondWeekEnableApply=false;
+                    }
+                }
+
+                Date enableApplyStartDate=applyStartDay;
+                Date enableApplyEndDate=secondSunday;
+                if(!firstWeekEnableApply){
+                    enableApplyStartDate=secondMonday;
+                }
+                if(!secondWeekEnableApply){
+                    enableApplyEndDate=secondMonday;
+                }
+
+                if(DateUtil.isSameDay(enableApplyStartDate,enableApplyEndDate)){
                     continue;
                 }
 
                 teacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
                 boolean enableCreateFirstCourse=true;
+                if(practiceGroup.getFirstCourseTime().before(enableApplyStartDate)
+                    ||practiceGroup.getFirstCourseTime().after(enableApplyEndDate)){
+                    enableCreateFirstCourse=false;
+                }
                 boolean enableCreateSecondCourse=true;
-                for (int i=0;i<teacherCourses.size()-1;i++) {
-                    CourseSchedule preCourseSchedule = teacherCourses.get(i);
+                if(practiceGroup.getSecondCourseTime().before(enableApplyStartDate)
+                        ||practiceGroup.getSecondCourseTime().after(enableApplyEndDate)){
+                    enableCreateSecondCourse=false;
+                }
+                for (int i=0;i<applyDateRangeCourses.size()-1;i++) {
+                    CourseSchedule preCourseSchedule = applyDateRangeCourses.get(i);
 
                     if(practiceGroup.getFirstCourseTime().before(preCourseSchedule.getEndClassTime())
                             &&firstClassEndTime.after(preCourseSchedule.getStartClassTime())){
@@ -236,17 +294,27 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                         enableCreateSecondCourse=false;
                     }
                 }
-                if (enableCreateFirstCourse&&enableCreateSecondCourse){
-                    includeTeacherIds.add(teacherId);
+                if (enableCreateFirstCourse){
+                    firstTeacherIds.add(teacherId);
+                }
+                if (enableCreateSecondCourse){
+                    secondTeacherIds.add(teacherId);
                 }
             }
-            if(!CollectionUtils.isEmpty(includeTeacherIds)){
+            if(!CollectionUtils.isEmpty(firstTeacherIds)&&!CollectionUtils.isEmpty(secondTeacherIds)){
                 break;
             }
         }
+        if(CollectionUtils.isEmpty(firstTeacherIds)||CollectionUtils.isEmpty(secondTeacherIds)){
+            throw new BizException("未找到符合条件的教师");
+        }
+
+        List<Integer> includeTeacherIds = firstTeacherIds.stream().filter(firstTeacherId -> secondTeacherIds.contains(firstTeacherId)).collect(Collectors.toList());
+
         if(CollectionUtils.isEmpty(includeTeacherIds)){
             throw new BizException("未找到符合条件的教师");
         }
+
         List<CourseScheduleTeacherSalary> studentRelateTeachers = courseScheduleTeacherSalaryDao.findStudentRelateTeachers(practiceGroup.getStudentId(), includeTeacherIds);
         Random random=new Random();
         if(!CollectionUtils.isEmpty(studentRelateTeachers)){
@@ -300,7 +368,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         calendar.set(Calendar.HOUR_OF_DAY, 0);
         calendar.set(Calendar.MINUTE, 0);
         calendar.set(Calendar.SECOND, 0);
-        List<Integer> includeTeacherIds=new ArrayList<>();
+        List<Integer> firstTeacherIds=new ArrayList<>();
+        List<Integer> secondTeacherIds=new ArrayList<>();
         while (calendar.getTime().before(activityEndDate)){
             calendar.add(Calendar.DATE,1);
             Date applyStartDay = calendar.getTime();
@@ -315,7 +384,11 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 continue;
             }
 
-            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, applyStartDay, applyEndDay);
+            Date firstMonday=DateUtil.getWeekDayWithDate(applyStartDay,Calendar.MONDAY);
+            Date secondMonday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.MONDAY);
+            Date secondSunday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.SUNDAY);
+
+            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, firstMonday, secondSunday);
 
             Date firstClassEndTime = DateUtil.addMinutes(practiceGroup.getFirstCourseTime(), practiceCourseMinutes);
             Date secondClassEndTime = DateUtil.addMinutes(practiceGroup.getSecondCourseTime(), practiceCourseMinutes);
@@ -324,20 +397,74 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             for (Integer teacherId : teacherIds) {
                 List<CourseSchedule> teacherCourses = teacherCoursesMap.get(teacherId);
                 if(CollectionUtils.isEmpty(teacherCourses)){
-                    includeTeacherIds.add(teacherId);
+                    if(!excludeFirstTime){
+                        firstTeacherIds.add(teacherId);
+                    }
+                    if(!excludeSecondTime){
+                        secondTeacherIds.add(teacherId);
+                    }
                     continue;
                 }
 
-                Map<GroupType, Long> groupTypeCountMap = teacherCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
-                if(Objects.nonNull(groupTypeCountMap.get(GroupType.PRACTICE))&&groupTypeCountMap.get(GroupType.PRACTICE)>80){
+                List<CourseSchedule> firstWeekCourses=new ArrayList<>();
+                List<CourseSchedule> secondWeekCourses=new ArrayList<>();
+                List<CourseSchedule> applyDateRangeCourses=new ArrayList<>();
+                for (CourseSchedule teacherCours : teacherCourses) {
+                    if(teacherCours.getClassDate().before(secondMonday)){
+                        firstWeekCourses.add(teacherCours);
+                    }else{
+                        secondWeekCourses.add(teacherCours);
+                    }
+                    if(!teacherCours.getClassDate().before(applyStartDay)
+                            &&(teacherCours.getClassDate().before(applyEndDay)||DateUtil.isSameDay(teacherCours.getClassDate(),applyEndDay))){
+                        applyDateRangeCourses.add(teacherCours);
+                    }
+                }
+
+                boolean firstWeekEnableApply=true;
+                boolean secondWeekEnableApply=true;
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountFirstMap = firstWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountFirstMap.get(GroupType.PRACTICE))&&groupTypeCountFirstMap.get(GroupType.PRACTICE)>80){
+                        firstWeekEnableApply=false;
+                    }
+                }
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountSecondMap = secondWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountSecondMap.get(GroupType.PRACTICE))&&groupTypeCountSecondMap.get(GroupType.PRACTICE)>80){
+                        secondWeekEnableApply=false;
+                    }
+                }
+
+                Date enableApplyStartDate=applyStartDay;
+                Date enableApplyEndDate=secondSunday;
+                if(!firstWeekEnableApply){
+                    enableApplyStartDate=secondMonday;
+                }
+                if(!secondWeekEnableApply){
+                    enableApplyEndDate=secondMonday;
+                }
+
+                if(DateUtil.isSameDay(enableApplyStartDate,enableApplyEndDate)){
                     continue;
                 }
 
                 teacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
                 boolean enableCreateFirstCourse=true;
+                if(practiceGroup.getFirstCourseTime().before(enableApplyStartDate)
+                        ||practiceGroup.getFirstCourseTime().after(enableApplyEndDate)){
+                    enableCreateFirstCourse=false;
+                }
                 boolean enableCreateSecondCourse=true;
-                for (int i=0;i<teacherCourses.size()-1;i++) {
-                    CourseSchedule preCourseSchedule = teacherCourses.get(i);
+                if(practiceGroup.getSecondCourseTime().before(enableApplyStartDate)
+                        ||practiceGroup.getSecondCourseTime().after(enableApplyEndDate)){
+                    enableCreateSecondCourse=false;
+                }
+
+                for (int i=0;i<applyDateRangeCourses.size()-1;i++) {
+                    CourseSchedule preCourseSchedule = applyDateRangeCourses.get(i);
 
                     if(practiceGroup.getFirstCourseTime().before(preCourseSchedule.getEndClassTime())
                             &&firstClassEndTime.after(preCourseSchedule.getStartClassTime())){
@@ -349,17 +476,27 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                         enableCreateSecondCourse=false;
                     }
                 }
-                if (enableCreateFirstCourse&&enableCreateSecondCourse){
-                    includeTeacherIds.add(teacherId);
+                if (enableCreateFirstCourse){
+                    firstTeacherIds.add(teacherId);
+                }
+                if (enableCreateSecondCourse){
+                    secondTeacherIds.add(teacherId);
                 }
             }
-            if(!CollectionUtils.isEmpty(includeTeacherIds)){
+            if(!CollectionUtils.isEmpty(firstTeacherIds)&&!CollectionUtils.isEmpty(secondTeacherIds)){
                 break;
             }
         }
+        if(CollectionUtils.isEmpty(firstTeacherIds)||CollectionUtils.isEmpty(secondTeacherIds)){
+            return null;
+        }
+
+        List<Integer> includeTeacherIds = firstTeacherIds.stream().filter(firstTeacherId -> secondTeacherIds.contains(firstTeacherId)).collect(Collectors.toList());
+
         if(CollectionUtils.isEmpty(includeTeacherIds)){
             return null;
         }
+
         List<Map<Integer, Integer>> teacherCourseNumMaps = courseScheduleTeacherSalaryDao.countTeacherCourses(includeTeacherIds, GroupType.PRACTICE);
         HashMap<Integer,Integer> teacherCourseNumMap= (HashMap<Integer, Integer>) MapUtil.convertIntegerMap(teacherCourseNumMaps);
         for (Integer includeTeacherId : includeTeacherIds) {
@@ -455,8 +592,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if(applyEndDay.after(activityEndDate)){
                 applyEndDay=activityEndDate;
             }
+            Date firstMonday=DateUtil.getWeekDayWithDate(applyStartDay,Calendar.MONDAY);
+            Date secondMonday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.MONDAY);
+            Date secondSunday=DateUtil.getWeekDayWithDate(applyEndDay,Calendar.SUNDAY);
+
             List<Date> enableApplyDates = getEnableApplyDates(applyStartDay,applyEndDay);
-            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, applyStartDay, applyEndDay);
+            List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, firstMonday, secondSunday);
             HashSet<Integer> excludeTeacherIds=new HashSet<>();
             if(Objects.nonNull(firstClassTime)){
                 Date firstClassEndTime = DateUtil.addMinutes(firstClassTime, practiceCourseMinutes);
@@ -477,34 +618,82 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     allTeacherFreeDates=new HashSet<>(enableApplyDates);
                     break;
                 }
-                Map<GroupType, Long> groupTypeCountMap = teacherCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
-                if(Objects.nonNull(groupTypeCountMap.get(GroupType.PRACTICE))&&groupTypeCountMap.get(GroupType.PRACTICE)>80){
+
+                List<CourseSchedule> firstWeekCourses=new ArrayList<>();
+                List<CourseSchedule> secondWeekCourses=new ArrayList<>();
+                List<CourseSchedule> applyDateRangeCourses=new ArrayList<>();
+                for (CourseSchedule teacherCours : teacherCourses) {
+                    if(teacherCours.getClassDate().before(secondMonday)){
+                        firstWeekCourses.add(teacherCours);
+                    }else{
+                        secondWeekCourses.add(teacherCours);
+                    }
+                    if(!teacherCours.getClassDate().before(applyStartDay)
+                        &&(teacherCours.getClassDate().before(applyEndDay)||DateUtil.isSameDay(teacherCours.getClassDate(),applyEndDay))){
+                        applyDateRangeCourses.add(teacherCours);
+                    }
+                }
+
+                boolean firstWeekEnableApply=true;
+                boolean secondWeekEnableApply=true;
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountFirstMap = firstWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountFirstMap.get(GroupType.PRACTICE))&&groupTypeCountFirstMap.get(GroupType.PRACTICE)>80){
+                        firstWeekEnableApply=false;
+                    }
+                }
+
+                if(!CollectionUtils.isEmpty(firstWeekCourses)){
+                    Map<GroupType, Long> groupTypeCountSecondMap = secondWeekCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType, Collectors.counting()));
+                    if(Objects.nonNull(groupTypeCountSecondMap.get(GroupType.PRACTICE))&&groupTypeCountSecondMap.get(GroupType.PRACTICE)>80){
+                        secondWeekEnableApply=false;
+                    }
+                }
+
+                Date enableApplyStartDate=applyStartDay;
+                Date enableApplyEndDate=secondSunday;
+                if(!firstWeekEnableApply){
+                    enableApplyStartDate=secondMonday;
+                }
+                if(!secondWeekEnableApply){
+                    enableApplyEndDate=secondMonday;
+                }
+
+                if(DateUtil.isSameDay(enableApplyStartDate,enableApplyEndDate)){
                     continue;
                 }
 
+                List<Date> tempEnableApplyDates=new ArrayList<>();
+                for (Date enableApplyDate : enableApplyDates) {
+                    if(!enableApplyDate.before(enableApplyStartDate)){
+                        tempEnableApplyDates.add(enableApplyDate);
+                    }
+                }
+
                 teacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
-                for (int j=0;j<teacherCourses.size()-1;j++) {
-                    CourseSchedule preCourseSchedule = teacherCourses.get(j);
-                    CourseSchedule backCourseSchedule = teacherCourses.get(j+1);
+                for (int j=0;j<applyDateRangeCourses.size()-1;j++) {
+                    CourseSchedule preCourseSchedule = applyDateRangeCourses.get(j);
+                    CourseSchedule backCourseSchedule = applyDateRangeCourses.get(j+1);
                     if(preCourseSchedule.getEndClassTime().after(backCourseSchedule.getEndClassTime())){
                         backCourseSchedule.setEndClassTime(preCourseSchedule.getEndClassTime());
                     }
                     if(j==0){
-                        for (Date enableApplyDate : enableApplyDates) {
+                        for (Date enableApplyDate : tempEnableApplyDates) {
                             Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
                             if(!enableApplyDateCourseEndTime.after(preCourseSchedule.getStartClassTime())){
                                 allTeacherFreeDates.add(enableApplyDate);
                             }
                         }
                     }
-                    if (j==teacherCourses.size()-2){
-                        for (Date enableApplyDate : enableApplyDates) {
+                    if (j==applyDateRangeCourses.size()-2){
+                        for (Date enableApplyDate : tempEnableApplyDates) {
                             if(!enableApplyDate.before(backCourseSchedule.getEndClassTime())){
                                 allTeacherFreeDates.add(enableApplyDate);
                             }
                         }
                     }
-                    for (Date enableApplyDate : enableApplyDates) {
+                    for (Date enableApplyDate : tempEnableApplyDates) {
                         Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
                         if(!enableApplyDate.before(preCourseSchedule.getEndClassTime())
                                 &&!enableApplyDateCourseEndTime.after(backCourseSchedule.getStartClassTime())){

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

@@ -958,6 +958,22 @@ public class DateUtil {
 	}
 
 	/**
+	 * @describe 根据指定日期获取所在周的指定星期数的日期
+	 * @author Joburgess
+	 * @date 2020/2/6
+	 * @param date: 日期
+	 * @param weekNum: 星期几
+	 * @return java.util.Date
+	 */
+	public static Date getWeekDayWithDate(Date date,int weekNum){
+		Calendar cal = Calendar.getInstance();
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		cal.setTime(date);
+		cal.set(Calendar.DAY_OF_WEEK,weekNum);
+		return cal.getTime();
+	}
+
+	/**
 	 * @describe 根据日期获取所在周获取下周一的时间
 	 * @author Joburgess
 	 * @date 2019/10/25