Browse Source

1、乐团课新增排课教师课酬计算逻辑调整
2、陪练课配置
3、陪练课接口

Joburgess 5 years ago
parent
commit
c390968717

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

@@ -1024,4 +1024,26 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     Set<Integer> queryVipCourseScheduleIds(Map<String, Object> params);
+
+    /**
+     * @describe 获取教师在指定时间段内的课程
+     * @author Joburgess
+     * @date 2020/2/2
+     * @param userIds: 教师编号列表
+     * @param startTime: 开始时间
+     * @param endTime: 结束时间
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
+    List<CourseSchedule> findTeachersCoursesWithDateRange(@Param("userIds") List<Integer> userIds,
+                                                          @Param("startTime") Date startTime,
+                                                          @Param("endTime") Date endTime);
+
+    /**
+     * @describe 获取指定学员的陪练课
+     * @author Joburgess
+     * @date 2020/2/3
+     * @param userId: 用户编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
+     */
+    List<CourseScheduleDto> findStudentPracticeCourses(@Param("userId") Integer userId);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -272,4 +272,26 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 											  @Param("groupType") GroupType groupType,
 											  @Param("courseType")CourseSchedule.CourseScheduleType courseType,
 											  @Param("teacherIds")List<Integer> teacherIds);
+
+	/**
+	 * @describe 获取与指定学生有关联的教师
+	 * @author Joburgess
+	 * @date 2020/2/3
+	 * @param studentId: 学生编号
+	 * @param teacherIds: 教师编号列表
+	 * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+	 */
+	List<CourseScheduleTeacherSalary> findStudentRelateTeachers(@Param("studentId") Integer studentId,
+																@Param("teacherIds") List<Integer> teacherIds);
+
+	/**
+	 * @describe 统计教师指定团体类型的课程数量
+	 * @author Joburgess
+	 * @date 2020/2/3
+	 * @param teacherIds: 教师编号列表
+	 * @param groupType: 课程类型
+	 * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+	 */
+	List<Map<Integer,Integer>> countTeacherCourses(@Param("teacherIds") List<Integer> teacherIds,
+												   @Param("groupType") GroupType groupType);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java

@@ -20,5 +20,14 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
     List<PracticeGroup> getUserPracticeCoursesWithDateRange(@Param("userId") Integer userId,
                                                             @Param("startDate") Date startDate,
                                                             @Param("endDate") Date endDate);
+
+    /**
+     * @describe 获取用户的申请记录
+     * @author Joburgess
+     * @date 2020/2/3
+     * @param userId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
+     */
+    List<PracticeGroup> getUserPracticeApplyRecord(@Param("userId") Integer userId);
 	
 }

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

@@ -211,4 +211,15 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      * @return
      */
     Map<String, Object> queryIncomeStatisticsWithCurrentMonth(@Param("organId") String organId);
+
+    /**
+     * @describe 统计学员购买小课成功的订单数量
+     * @author Joburgess
+     * @date 2020/2/3
+     * @param userId: 用户编号
+     * @param vipGroupId: 小课编号
+     * @return int
+     */
+    int countUserBuyVipGroupSuccessOrder(@Param("userId") Integer userId,
+                                         @Param("vipGroupId") Integer vipGroupId);
 }

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

@@ -75,6 +75,17 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<TeacherBasicDto> findTeachers(@Param("userIds") List<Integer> userIds);
 
     /**
+     * @describe 获取指定声部和分部下的老师
+     * @author Joburgess
+     * @date 2020/2/2
+     * @param organId: 分部编号
+     * @param subjectId: 声部编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherBasicDto>
+     */
+    List<TeacherBasicDto> findTeaTeachersByOrganAndSubject(@Param("organId") Integer organId,
+                                                           @Param("subjectId") Integer subjectId);
+
+    /**
      * @describe 根据部门和声部获取教师列表
      * @author Joburgess
      * @date 2019/12/24

+ 33 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroup.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import java.util.Date;
+
 /**
  * 对应数据库表(practice_group):
  */
@@ -18,12 +20,18 @@ public class PracticeGroup {
 	
 	/**  */
 	private Integer userId;
+
+	private Integer studentId;
 	
 	/**  */
 	private Integer singleClassMinutes;
 	
 	/**  */
 	private Integer organId;
+
+	private Date firstCourseTime;
+
+	private Date secondCourseTime;
 	
 	/**  */
 	private java.util.Date coursesStartDate;
@@ -39,7 +47,31 @@ public class PracticeGroup {
 	
 	/**  */
 	private String memo;
-	
+
+	public Integer getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Integer studentId) {
+		this.studentId = studentId;
+	}
+
+	public Date getFirstCourseTime() {
+		return firstCourseTime;
+	}
+
+	public void setFirstCourseTime(Date firstCourseTime) {
+		this.firstCourseTime = firstCourseTime;
+	}
+
+	public Date getSecondCourseTime() {
+		return secondCourseTime;
+	}
+
+	public void setSecondCourseTime(Date secondCourseTime) {
+		this.secondCourseTime = secondCourseTime;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}

+ 33 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java

@@ -1,22 +1,30 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CourseScheduleDto;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 
 	/**
+	 * @describe 获取学生的陪练课
+	 * @author Joburgess
+	 * @date 2020/2/3
+	 * @param userId:
+	 * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
+	 */
+	List<CourseScheduleDto> findUserPracticeCourses(Integer userId);
+
+	/**
 	 * 给学生指派老师
-	 * @param userId 学生编号
-	 * @param subjectId 学生选择的专业
-	 * @param startTime 开课时间
-	 * @param endTime 结束时间
+	 * @param practiceGroup: 申请参数
 	 * @return
 	 */
-	Integer searchTeacherId(Integer userId, Integer subjectId, Date startTime, Date endTime);
+	Integer searchTeacherId(PracticeGroup practiceGroup);
 
     /**
      * @describe 获取陪练课预约参数
@@ -28,6 +36,26 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
     Map getPracticeApplyParams(Integer userId);
 
     /**
+     * @describe 获取指定学员所在分部下的教师空闲时间
+     * @author Joburgess
+     * @date 2020/2/2
+     * @param userId: 用户编号
+	 * @param subjectId: 声部编号
+     * @param firstClassTime: 第一节课开始时间
+     * @return java.util.Map
+     */
+    Map getTeacherFreeTimes(Integer userId, Integer subjectId, Date firstClassTime);
+
+    /**
+     * @describe 获取指定日期内课一预约课程的时间
+     * @author Joburgess
+     * @date 2020/2/2
+     * @param days: 天数
+     * @return java.util.Map
+     */
+	List<Date> getEnableApplyDates(Integer days);
+
+    /**
      * @describe 陪练课预约
      * @author Joburgess
      * @date 2020/1/31

+ 417 - 146
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -1,6 +1,10 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CourseScheduleDto;
+import com.ym.mec.biz.dal.dto.TeacherBasicDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.PracticeGroupService;
@@ -9,6 +13,7 @@ import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,122 +23,375 @@ import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
-public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGroup> implements PracticeGroupService{
-
-	@Autowired
-	private PracticeGroupDao practiceGroupDao;
-	@Autowired
-	private SysConfigService sysConfigService;
-	@Autowired
-	private SubjectDao subjectDao;
-	@Autowired
+public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGroup> implements PracticeGroupService {
+
+    @Autowired
+    private PracticeGroupDao practiceGroupDao;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private SubjectDao subjectDao;
+    @Autowired
     private TeacherService teacherService;
-	@Autowired
+    @Autowired
     private EmployeeDao employeeDao;
-	@Autowired
+    @Autowired
     private ClassGroupDao classGroupDao;
-	@Autowired
+    @Autowired
     private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
-	@Autowired
+    @Autowired
     private ClassGroupTeacherSalaryDao classGroupTeacherSalaryDao;
-	@Autowired
+    @Autowired
     private CourseScheduleDao courseScheduleDao;
-	@Autowired
+    @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	@Autowired
+    @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-	@Autowired
+    @Autowired
     private TeacherAttendanceDao teacherAttendanceDao;
-	@Autowired
+    @Autowired
     private StudentDao studentDao;
-	@Autowired
+    @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @Override
+    public BaseDAO<Long, PracticeGroup> getDAO() {
+        return practiceGroupDao;
+    }
+
+    @Override
+    public List<CourseScheduleDto> findUserPracticeCourses(Integer userId) {
+        return courseScheduleDao.findStudentPracticeCourses(userId);
+    }
+
+    @Override
+    public Integer searchTeacherId(PracticeGroup practiceGroup) {
+        if (Objects.isNull(practiceGroup.getSubjectId())) {
+            throw new BizException("请选择声部");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroup.getStudentId());
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(sysUser.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+        List<TeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject(sysUser.getOrganId(), practiceGroup.getSubjectId());
+        if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
+            throw new BizException("未找到合适教师");
+        }
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes=practiceCourseMinutesConfig.getParanValue(Integer.class);
+        List<Integer> teacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.add(Calendar.DATE,1);
+        Date applyStartDay = calendar.getTime();
+        calendar.add(Calendar.DATE,7);
+        Date applyEndDay = calendar.getTime();
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, applyStartDay, applyEndDay);
+        List<Integer> includeTeacherIds=new ArrayList<>();
+
+        Date firstClassEndTime = DateUtil.addMinutes(practiceGroup.getFirstCourseTime(), practiceCourseMinutes);
+        Date secondClassEndTime = DateUtil.addMinutes(practiceGroup.getSecondCourseTime(), practiceCourseMinutes);
 
-	@Override
-	public BaseDAO<Long, PracticeGroup> getDAO() {
-		return practiceGroupDao;
-	}
+        Map<Integer, List<CourseSchedule>> teacherCoursesMap = allTeacherCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getActualTeacherId));
+        for (Map.Entry<Integer, List<CourseSchedule>> integerListEntry : teacherCoursesMap.entrySet()) {
+            List<CourseSchedule> teacherCourses = integerListEntry.getValue();
+            teacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+            boolean enableCreateFirstCourse=false;
+            boolean enableCreateSecondCourse=false;
+            for (int i=0;i<teacherCourses.size()-1;i++) {
+                CourseSchedule preCourseSchedule = teacherCourses.get(i);
+                CourseSchedule backCourseSchedule = teacherCourses.get(i+1);
+                if(i==0){
+                    if (!firstClassEndTime.after(preCourseSchedule.getStartClassTime())){
+                        enableCreateFirstCourse=true;
+                    }
+                    if (!secondClassEndTime.after(preCourseSchedule.getStartClassTime())){
+                        enableCreateSecondCourse=true;
+                    }
+                }
+                if (i==teacherCourses.size()-1){
+                    if(!practiceGroup.getFirstCourseTime().before(backCourseSchedule.getEndClassTime())){
+                        enableCreateFirstCourse=true;
+                    }
+                    if(!practiceGroup.getSecondCourseTime().before(backCourseSchedule.getEndClassTime())){
+                        enableCreateSecondCourse=true;
+                    }
+                }
 
-	@Override
-	public Integer searchTeacherId(Integer userId, Integer subjectId, Date startTime, Date endTime) {
-		// TODO Auto-generated method stub
-		return null;
-	}
+                if(!practiceGroup.getFirstCourseTime().before(preCourseSchedule.getEndClassTime())
+                        &&!firstClassEndTime.after(backCourseSchedule.getStartClassTime())){
+                    enableCreateFirstCourse=true;
+                }
+
+                if(!practiceGroup.getSecondCourseTime().before(preCourseSchedule.getEndClassTime())
+                        &&!secondClassEndTime.after(backCourseSchedule.getStartClassTime())){
+                    enableCreateFirstCourse=true;
+                }
+                if (enableCreateFirstCourse&&enableCreateSecondCourse){
+                    includeTeacherIds.add(integerListEntry.getKey());
+                    break;
+                }
+            }
+        }
+        if(CollectionUtils.isEmpty(includeTeacherIds)){
+            throw new BizException("未找到符合条件的教师");
+        }
+        List<CourseScheduleTeacherSalary> studentRelateTeachers = courseScheduleTeacherSalaryDao.findStudentRelateTeachers(practiceGroup.getStudentId(), includeTeacherIds);
+        Random random=new Random();
+        if(!CollectionUtils.isEmpty(studentRelateTeachers)){
+            Map<GroupType, List<CourseScheduleTeacherSalary>> groupTypeTeachersMap = studentRelateTeachers.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getGroupType));
+            List<CourseScheduleTeacherSalary> vipGroupTeachers = groupTypeTeachersMap.get(GroupType.VIP);
+            if(!CollectionUtils.isEmpty(vipGroupTeachers)){
+                int randomIndex = random.nextInt(vipGroupTeachers.size());
+                return vipGroupTeachers.get(randomIndex).getUserId();
+            }
+            List<CourseScheduleTeacherSalary> musicGroupTeachers = groupTypeTeachersMap.get(GroupType.MUSIC);
+            if(!CollectionUtils.isEmpty(musicGroupTeachers)){
+                int randomIndex = random.nextInt(musicGroupTeachers.size());
+                return musicGroupTeachers.get(randomIndex).getUserId();
+            }
+        }
 
+        List<Map<Integer, Integer>> teacherCourseNumMaps = courseScheduleTeacherSalaryDao.countTeacherCourses(teacherIds, GroupType.PRACTICE);
+        Map<Integer,Integer> teacherCourseNumMap=MapUtil.convertIntegerMap(teacherCourseNumMaps);
+        Map<Integer,Integer> temp=new HashMap<>();
+        teacherCourseNumMap.entrySet().stream()
+                .sorted()
+                .forEach(result->temp.put(result.getKey(),result.getValue()));
+        return temp.get(0);
+    }
 
-	@Override
-	public Map getPracticeApplyParams(Integer userId) {
-		Map result=new HashMap();
-		SysConfig practiceSubjectIdListConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_SUBJECT_ID_LIST);
-		SysConfig practiceApplyStartTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_START_TIME);
-		SysConfig practiceApplyEndTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_END_TIME);
+    @Override
+    public Map getPracticeApplyParams(Integer userId) {
+        Map result = new HashMap();
+        SysConfig practiceSubjectIdListConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_SUBJECT_ID_LIST);
+        SysConfig practiceApplyStartTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_START_TIME);
+        SysConfig practiceApplyEndTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_END_TIME);
+        SysConfig practiceApplyIntervalTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_INTERVAL_TIME);
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
         Student student = studentDao.get(userId);
         List<Subject> subjects = subjectDao.findBySubjectByIdList(practiceSubjectIdListConfig.getParanValue());
-		result.put("subjects", subjects);
-		result.put("practiceApplyStartTime",practiceApplyStartTimeConfig.getParanValue());
-		result.put("practiceApplyEndTime",practiceApplyEndTimeConfig.getParanValue());
-		result.put("userDefaultSubjectIds",Objects.isNull(student)?null:student.getSubjectIdList());
-		return result;
-	}
-
-	@Override
+        List<Integer> subjectIds = Arrays.asList(practiceSubjectIdListConfig.getParanValue().split(",")).stream().mapToInt(idStr -> Integer.valueOf(idStr)).boxed().collect(Collectors.toList());
+        List<Integer> userDefaultSubjectIds=Objects.isNull(student) ? null : Arrays.asList(student.getSubjectIdList().split(",")).stream().mapToInt(idStr -> Integer.valueOf(idStr)).boxed().collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(userDefaultSubjectIds)){
+            userDefaultSubjectIds=userDefaultSubjectIds.stream().filter(userDefaultSubjectId -> subjectIds.contains(userDefaultSubjectId)).collect(Collectors.toList());
+        }
+        result.put("subjects", subjects);
+        result.put("practiceApplyStartTime", practiceApplyStartTimeConfig.getParanValue());
+        result.put("practiceApplyEndTime", practiceApplyEndTimeConfig.getParanValue());
+        result.put("userDefaultSubjectIds", StringUtils.join(userDefaultSubjectIds.toArray(),","));
+        result.put("practiceApplyIntervalMinutes", practiceApplyIntervalTimeConfig.getParanValue(Integer.class));
+        result.put("practiceCourseMinutes", practiceCourseMinutesConfig.getParanValue(Integer.class));
+        return result;
+    }
+
+    @Override
+    public Map getTeacherFreeTimes(Integer userId, Integer subjectId, Date firstClassTime) {
+        if (Objects.isNull(subjectId)) {
+            throw new BizException("请选择声部");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(userId);
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(sysUser.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+        List<TeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject(sysUser.getOrganId(), subjectId);
+        if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
+            throw new BizException("未找到合适教师");
+        }
+        Map result = new HashMap();
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes=practiceCourseMinutesConfig.getParanValue(Integer.class);
+        List<Integer> teacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.add(Calendar.DATE,1);
+        Date applyStartDay = calendar.getTime();
+        calendar.add(Calendar.DATE,7);
+        Date applyEndDay = calendar.getTime();
+        List<Date> enableApplyDates = getEnableApplyDates(7);
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeachersCoursesWithDateRange(teacherIds, applyStartDay, applyEndDay);
+        HashSet<Integer> excludeTeacherIds=new HashSet<>();
+        if(Objects.nonNull(firstClassTime)){
+            Date firstClassEndTime = DateUtil.addMinutes(firstClassTime, practiceCourseMinutes);
+            for (CourseSchedule teacherCourse : allTeacherCourses) {
+                if((!teacherCourse.getStartClassTime().before(firstClassTime)&&!teacherCourse.getStartClassTime().after(firstClassEndTime))
+                    ||(!teacherCourse.getEndClassTime().before(firstClassTime)&&!teacherCourse.getEndClassTime().after(firstClassEndTime))){
+                    excludeTeacherIds.add(teacherCourse.getActualTeacherId());
+                }
+            }
+        }
+        Map<Integer, List<CourseSchedule>> teacherCoursesMap = allTeacherCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getActualTeacherId));
+        Set<Date> allTeacherFreeDates=new HashSet<>();
+        for (Map.Entry<Integer, List<CourseSchedule>> integerListEntry : teacherCoursesMap.entrySet()) {
+            if(excludeTeacherIds.contains(integerListEntry.getKey())){
+                continue;
+            }
+            List<CourseSchedule> teacherCourses = integerListEntry.getValue();
+            teacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+            for (int i=0;i<teacherCourses.size()-1;i++) {
+                CourseSchedule preCourseSchedule = teacherCourses.get(i);
+                CourseSchedule backCourseSchedule = teacherCourses.get(i+1);
+                if(i==0){
+                    for (Date enableApplyDate : enableApplyDates) {
+                        Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+                        if(!enableApplyDateCourseEndTime.after(preCourseSchedule.getStartClassTime())){
+                            allTeacherFreeDates.add(enableApplyDate);
+                        }
+                    }
+                }
+                if (i==teacherCourses.size()-1){
+                    for (Date enableApplyDate : enableApplyDates) {
+                        if(!enableApplyDate.before(backCourseSchedule.getEndClassTime())){
+                            allTeacherFreeDates.add(enableApplyDate);
+                        }
+                    }
+                }
+                for (Date enableApplyDate : enableApplyDates) {
+                    Date enableApplyDateCourseEndTime = DateUtil.addMinutes(enableApplyDate, practiceCourseMinutes);
+                    if(!enableApplyDate.before(preCourseSchedule.getEndClassTime())
+                        &&!enableApplyDateCourseEndTime.after(backCourseSchedule.getStartClassTime())){
+                        allTeacherFreeDates.add(enableApplyDate);
+                    }
+                }
+            }
+        }
+        result.put("teacherFreeDates",allTeacherFreeDates);
+        return result;
+    }
+
+    @Override
+    public List<Date> getEnableApplyDates(Integer days) {
+        List<Date> result=new ArrayList<>();
+        Calendar calendar = Calendar.getInstance();
+        Date now = new Date();
+        calendar.setTime(now);
+        calendar.set(Calendar.SECOND, 0);
+        SysConfig practiceApplyStartTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_START_TIME);
+        SysConfig practiceApplyEndTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_END_TIME);
+        SysConfig practiceApplyIntervalTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_INTERVAL_TIME);
+        String enableStartTimeStr = practiceApplyStartTimeConfig.getParanValue();
+        String enableEndTimeStr = practiceApplyEndTimeConfig.getParanValue();
+        Integer practiceApplyIntervalMinutes=practiceApplyIntervalTimeConfig.getParanValue(Integer.class);
+        for (int i = 0; i < days; i++) {
+            calendar.add(Calendar.DATE, 1);
+            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(enableStartTimeStr.split(":")[0]));
+            calendar.set(Calendar.MINUTE, Integer.valueOf(enableStartTimeStr.split(":")[1]));
+            Date enableApplyDayStartTime=calendar.getTime();
+            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(enableEndTimeStr.split(":")[0]));
+            calendar.set(Calendar.MINUTE, Integer.valueOf(enableEndTimeStr.split(":")[1]));
+            Date enableApplyDayEndTime=calendar.getTime();
+            result.add(enableApplyDayStartTime);
+            Calendar applyStartCalendar=Calendar.getInstance();
+            applyStartCalendar.setTime(enableApplyDayStartTime);
+            while (true){
+                applyStartCalendar.add(Calendar.MINUTE,practiceApplyIntervalMinutes);
+                if(applyStartCalendar.getTime().after(enableApplyDayEndTime)){
+                    break;
+                }
+                result.add(applyStartCalendar.getTime());
+            }
+        }
+        return result;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
-	public Map practiceApply(PracticeGroup practiceGroup) {
-		Integer practiceCourseMinutes=25;
-		SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
-		if(Objects.nonNull(practiceCourseMinutesConfig)){
-			practiceCourseMinutes=practiceCourseMinutesConfig.getParanValue(Integer.class);
-		}
+    public Map practiceApply(PracticeGroup practiceGroup) {
+        Integer practiceCourseMinutes = 25;
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        if (Objects.nonNull(practiceCourseMinutesConfig)) {
+            practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        }
         SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-		Date now=new Date();
-		Date nextWeekMonday = DateUtil.getNextWeekMonday(now);
-		Date nextWeekFriday = DateUtil.getNextWeekDay(now,11);
-		if(practiceGroup.getCoursesStartDate().before(nextWeekMonday)
-			||(practiceGroup.getCoursesStartDate().after(nextWeekFriday)
-				&&!DateUtil.isSameDay(practiceGroup.getCoursesStartDate(),nextWeekFriday))){
-			throw new BizException("预约时间超过范围");
-		}
-
-		Integer applyTimes=0;
-        List<PracticeGroup> userPracticeCoursesWithDateRange = practiceGroupDao.getUserPracticeCoursesWithDateRange(practiceGroup.getUserId(), nextWeekMonday, nextWeekFriday);
-        if(!CollectionUtils.isEmpty(userPracticeCoursesWithDateRange)){
-            applyTimes=userPracticeCoursesWithDateRange.size();
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.add(Calendar.DATE,1);
+        Date applyStartDay = calendar.getTime();
+        calendar.add(Calendar.DATE,8);
+        Date applyEndDay = calendar.getTime();
+        if (practiceGroup.getFirstCourseTime().before(applyStartDay)
+                || (practiceGroup.getFirstCourseTime().after(applyEndDay)
+                && !DateUtil.isSameDay(practiceGroup.getFirstCourseTime(), applyStartDay))) {
+            throw new BizException("预约时间超过范围");
+        }
+        if (practiceGroup.getSecondCourseTime().before(applyStartDay)
+                || (practiceGroup.getSecondCourseTime().after(applyEndDay)
+                && !DateUtil.isSameDay(practiceGroup.getSecondCourseTime(), applyStartDay))) {
+            throw new BizException("预约时间超过范围");
         }
 
-        if(applyTimes>=2){
-            throw new BizException("您的预约次数已经达到限制");
+        List<Date> allCourseDates=new ArrayList<>();
+        allCourseDates.add(practiceGroup.getFirstCourseTime());
+        allCourseDates.add(practiceGroup.getSecondCourseTime());
+        allCourseDates.add(DateUtil.addDays(practiceGroup.getFirstCourseTime(),7));
+        allCourseDates.add(DateUtil.addDays(practiceGroup.getSecondCourseTime(),7));
+        allCourseDates.sort(Comparator.comparing(Date::getTime));
+
+        Integer applyTimes = 0;
+        List<PracticeGroup> userPracticeCoursesWithDateRange = practiceGroupDao.getUserPracticeApplyRecord(practiceGroup.getStudentId());
+        if (!CollectionUtils.isEmpty(userPracticeCoursesWithDateRange)) {
+            applyTimes = userPracticeCoursesWithDateRange.size();
         }
-        applyTimes+=1;
 
-        practiceGroup.setCoursesExpireDate(DateUtil.addMinutes(practiceGroup.getCoursesStartDate(),practiceCourseMinutes));
-		Integer teacherId = searchTeacherId(practiceGroup.getUserId(),practiceGroup.getSubjectId(),practiceGroup.getCoursesStartDate(),practiceGroup.getCoursesExpireDate());
-        if(Objects.isNull(teacherId)){
-//            throw new BizException("教师指派错误");
-            teacherId=100001;
+//        if (applyTimes >= 1) {
+//            throw new BizException("您的预约次数已经达到限制");
+//        }
+        applyTimes += 1;
+
+        practiceGroup.setCoursesStartDate(allCourseDates.get(0));
+        practiceGroup.setCoursesExpireDate(DateUtil.addMinutes(allCourseDates.get(3),practiceCourseMinutes));
+        Integer teacherId = searchTeacherId(practiceGroup);
+        if (Objects.isNull(teacherId)) {
+            throw new BizException("教师指派错误");
         }
-		Teacher teacher = teacherService.getDetail(teacherId);
+        practiceGroup.setUserId(teacherId);
+        Teacher teacher = teacherService.getDetail(teacherId);
         Employee employee = employeeDao.get(teacherId);
-        if(StringUtils.isEmpty(employee.getOrganIdList()) || employee.getOrganIdList().contains(",")){
+        if (Objects.isNull(employee) || StringUtils.isEmpty(employee.getOrganIdList()) || employee.getOrganIdList().contains(",")) {
             practiceGroup.setOrganId(teacher.getTeacherOrganId());
-        }else {
+        } else {
             practiceGroup.setOrganId(Integer.parseInt(employee.getOrganIdList()));
         }
-        Subject subject=subjectDao.get(practiceGroup.getSubjectId());
-        if(Objects.isNull(subject)){
+        Subject subject = subjectDao.get(practiceGroup.getSubjectId());
+        if (Objects.isNull(subject)) {
             throw new BizException("声部不存在");
         }
-        practiceGroup.setName(subject.getName()+"•陪练课");
+        practiceGroup.setName(subject.getName() + "•陪练课");
         practiceGroup.setSingleClassMinutes(practiceCourseMinutes);
         practiceGroupDao.insert(practiceGroup);
 
         //创建班级信息
-        ClassGroup classGroup=new ClassGroup();
+        ClassGroup classGroup = new ClassGroup();
         classGroup.setSubjectIdList(practiceGroup.getSubjectId().toString());
         classGroup.setExpectStudentNum(1);
+        classGroup.setStudentNum(1);
         classGroup.setName(practiceGroup.getName());
-        classGroup.setTotalClassTimes(1);
+        classGroup.setTotalClassTimes(4);
         classGroup.setType(ClassGroupTypeEnum.PRACTICE);
         classGroup.setDelFlag(0);
         classGroup.setGroupType(GroupType.PRACTICE);
@@ -143,7 +401,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         classGroupDao.insert(classGroup);
 
         //创建班级老师关联记录
-        ClassGroupTeacherMapper classGroupTeacherMapper=new ClassGroupTeacherMapper();
+        ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
         classGroupTeacherMapper.setMusicGroupId(practiceGroup.getId().toString());
         classGroupTeacherMapper.setClassGroupId(classGroup.getId());
         classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
@@ -154,7 +412,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
 
         //创建班级与老师课酬记录
-        ClassGroupTeacherSalary classGroupTeacherSalary=new ClassGroupTeacherSalary();
+        ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
         classGroupTeacherSalary.setMusicGroupId(practiceGroup.getId().toString());
         classGroupTeacherSalary.setClassGroupId(classGroup.getId());
         classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
@@ -170,88 +428,101 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
         classGroupStudentMapper.setMusicGroupId(practiceGroup.getId().toString());
         classGroupStudentMapper.setClassGroupId(classGroup.getId());
-        classGroupStudentMapper.setUserId(practiceGroup.getUserId());
+        classGroupStudentMapper.setUserId(practiceGroup.getStudentId());
         classGroupStudentMapper.setCreateTime(now);
         classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
         classGroupStudentMapper.setGroupType(GroupType.PRACTICE);
         classGroupStudentMapperDao.insert(classGroupStudentMapper);
 
-        //课表
-        CourseSchedule courseSchedule = new CourseSchedule();
-        courseSchedule.setMusicGroupId(practiceGroup.getId().toString());
-        courseSchedule.setClassGroupId(classGroup.getId());
-        courseSchedule.setStatus(CourseStatusEnum.NOT_START);
-        courseSchedule.setClassDate(practiceGroup.getCoursesStartDate());
-        courseSchedule.setStartClassTime(practiceGroup.getCoursesStartDate());
-        courseSchedule.setEndClassTime(practiceGroup.getCoursesExpireDate());
-        courseSchedule.setTeacherId(teacherId);
-        courseSchedule.setActualTeacherId(teacherId);
-        courseSchedule.setCreateTime(now);
-        courseSchedule.setUpdateTime(now);
-        courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
-        courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
-        courseSchedule.setGroupType(GroupType.PRACTICE);
-        courseSchedule.setName(practiceGroup.getName());
-        courseScheduleDao.insert(courseSchedule);
-
-        //课程与老师薪水表
-        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-        courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-        courseScheduleTeacherSalary.setGroupType(GroupType.PRACTICE);
-        courseScheduleTeacherSalary.setMusicGroupId(practiceGroup.getId().toString());
-        courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
-        courseScheduleTeacherSalary.setUserId(teacherId);
-        courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
-        courseScheduleTeacherSalary.setCreateTime(now);
-        courseScheduleTeacherSalary.setUpdateTime(now);
-        courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-        courseScheduleTeacherSalaryDao.insert(courseScheduleTeacherSalary);
-
-        //学生缴费记录
-        CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
-        courseScheduleStudentPayment.setGroupType(GroupType.PRACTICE);
-        courseScheduleStudentPayment.setMusicGroupId(practiceGroup.getId().toString());
-        courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
-        courseScheduleStudentPayment.setUserId(practiceGroup.getUserId());
-        courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
-        courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
-        courseScheduleStudentPayment.setCreateTime(now);
-        courseScheduleStudentPayment.setUpdateTime(now);
-        courseScheduleStudentPaymentDao.insert(courseScheduleStudentPayment);
-
-        //教师签到记录
-        TeacherAttendance teacherAttendance = new TeacherAttendance();
-        teacherAttendance.setMusicGroupId(practiceGroup.getId().toString());
-        teacherAttendance.setTeacherId(teacherId);
-        teacherAttendance.setClassGroupId(classGroup.getId());
-        teacherAttendance.setGroupType(GroupType.PRACTICE);
-        teacherAttendance.setCourseScheduleId(courseSchedule.getId());
-        teacherAttendance.setCreateTime(now);
-        teacherAttendanceDao.insert(teacherAttendance);
-
-        Student student = studentDao.get(practiceGroup.getUserId());
-        if(Objects.isNull(student)){
-            student=new Student();
-            student.setUserId(practiceGroup.getUserId());
+        List<CourseSchedule> courseSchedules=new ArrayList<>();
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries=new ArrayList<>();
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
+        List<TeacherAttendance> teacherAttendances=new ArrayList<>();
+
+        for (Date courseDate : allCourseDates) {
+            //课表
+            CourseSchedule courseSchedule = new CourseSchedule();
+            courseSchedule.setMusicGroupId(practiceGroup.getId().toString());
+            courseSchedule.setClassGroupId(classGroup.getId());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setClassDate(courseDate);
+            courseSchedule.setStartClassTime(courseDate);
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseDate,practiceCourseMinutes));
+            courseSchedule.setTeacherId(teacherId);
+            courseSchedule.setActualTeacherId(teacherId);
+            courseSchedule.setCreateTime(now);
+            courseSchedule.setUpdateTime(now);
+            courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+            courseSchedule.setGroupType(GroupType.PRACTICE);
+            courseSchedule.setName(practiceGroup.getName());
+            courseSchedules.add(courseSchedule);
+
+            //课程与老师薪水表
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(GroupType.PRACTICE);
+            courseScheduleTeacherSalary.setMusicGroupId(practiceGroup.getId().toString());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(teacherId);
+            courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+            courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+            courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+            //学生缴费记录
+            CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+            courseScheduleStudentPayment.setGroupType(GroupType.PRACTICE);
+            courseScheduleStudentPayment.setMusicGroupId(practiceGroup.getId().toString());
+            courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleStudentPayment.setUserId(practiceGroup.getStudentId());
+            courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
+            courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+            courseScheduleStudentPayment.setCreateTime(now);
+            courseScheduleStudentPayment.setUpdateTime(now);
+            courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+
+            //教师签到记录
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setMusicGroupId(practiceGroup.getId().toString());
+            teacherAttendance.setTeacherId(teacherId);
+            teacherAttendance.setClassGroupId(classGroup.getId());
+            teacherAttendance.setGroupType(GroupType.PRACTICE);
+            teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+            teacherAttendance.setCreateTime(now);
+            teacherAttendances.add(teacherAttendance);
+        }
+
+        courseScheduleDao.batchAddCourseSchedules(courseSchedules);
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+
+        Student student = studentDao.get(practiceGroup.getStudentId());
+        if (Objects.isNull(student)) {
+            student = new Student();
+            student.setUserId(practiceGroup.getStudentId());
             student.setSubjectIdList(practiceGroup.getSubjectId().toString());
             studentDao.insert(student);
-        }else{
-            if(Objects.isNull(student.getSubjectIdList())){
+        } else {
+            if (Objects.isNull(student.getSubjectIdList())) {
                 student.setSubjectIdList(practiceGroup.getSubjectId().toString());
-            }else{
+            } else {
                 String[] studentIdStrings = student.getSubjectIdList().split(",");
                 List<String> studentIds = new ArrayList<>(Arrays.asList(studentIdStrings));
-                if(!studentIds.contains(practiceGroup.getSubjectId().toString())){
+                if (!studentIds.contains(practiceGroup.getSubjectId().toString())) {
                     studentIds.add(practiceGroup.getSubjectId().toString());
                 }
-                student.setSubjectIdList(StringUtils.join(studentIds.toArray(),","));
+                student.setSubjectIdList(StringUtils.join(studentIds.toArray(), ","));
             }
             studentDao.update(student);
         }
 
-        Map result=new HashMap();
-        result.put("teacherName",teacher.getRealName());
-        result.put("enableApply",applyTimes<2?1:0);
+        Map result = new HashMap();
+        result.put("teacherName", teacher.getRealName());
+        result.put("enableApply", applyTimes < 1 ? 1 : 0);
         return result;
-	}
+    }
+
 }

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

@@ -1237,7 +1237,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		Integer userId = order.getUserId();
 		boolean isOk=order.getStatus().equals(DealStatusEnum.SUCCESS);
 
-        StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(order.getId());
+		int successOrderNum = studentPaymentOrderDao.countUserBuyVipGroupSuccessOrder(userId, vipGroupId.intValue());
+		if(successOrderNum>0){
+			return;
+		}
+
+		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(order.getId());
 		if(studentPaymentOrder.getStatus().equals(DealStatusEnum.SUCCESS)){
 			return;
 		}

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

@@ -2084,4 +2084,43 @@
         </if>
         <include refid="queryVipCourseScheduleIds"/>
     </select>
+    <select id="findTeachersCoursesWithDateRange" resultMap="CourseSchedule">
+        SELECT
+            cs.id_,
+            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_,
+            csts.user_id_ actual_teacher_id_
+        FROM
+            course_schedule_teacher_salary csts
+            LEFT JOIN course_schedule cs 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")
+        AND csts.user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </select>
+    <select id="findStudentPracticeCourses" resultMap="courseScheduleDto">
+        SELECT
+            cs.id_ seal_class_id_,
+            cs.type_,
+            cs.id_,
+            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.actual_teacher_id_,
+            cs.status_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.teach_mode_,
+            cs.music_group_id_,
+            cs.group_type_,
+            su.real_name_ teacher_name_
+        FROM
+          course_schedule_student_payment cssp
+          LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
+          LEFT JOIN sys_user su ON cs.actual_teacher_id_=su.id_
+        WHERE cs.group_type_='PRACTICE'
+          AND cssp.user_id_=#{userId}
+    </select>
 </mapper>

+ 26 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -445,4 +445,30 @@
 			</foreach>
 		  ORDER BY csts.create_time_ DESC
     </select>
+    <select id="findStudentRelateTeachers" resultMap="CourseScheduleTeacherSalary">
+		SELECT
+			csts.*
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule_teacher_salary csts ON cssp.course_schedule_id_=csts.course_schedule_id_
+		WHERE cssp.user_id_=#{studentId} AND csts.user_id_ IN
+		<foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+			#{teacherIds}
+		</foreach>
+    </select>
+	<select id="countTeacherCourses" resultType="java.util.Map">
+		SELECT
+			user_id_ AS 'key',
+			COUNT(course_schedule_id_) AS 'value'
+		FROM
+			course_schedule_teacher_salary
+		WHERE
+			user_id_ IN
+			<foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+				#{teacherIds}
+			</foreach>
+			AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		GROUP BY
+			user_id_
+	</select>
 </mapper>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -54,4 +54,7 @@
     <select id="getUserPracticeCoursesWithDateRange" resultMap="PracticeGroup">
 		SELECT * FROM practice_group WHERE user_id_=#{userId} AND (courses_start_date_ BETWEEN DATE_FORMAT(#{startDate},'%Y-%m-%d') AND DATE_FORMAT(#{endDate},'%Y-%m-%d'))
 	</select>
+    <select id="getUserPracticeApplyRecord" resultMap="PracticeGroup">
+		SELECT * FROM practice_group WHERE user_id_=#{userId}
+    </select>
 </mapper>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -504,4 +504,7 @@
    			and FIND_IN_SET(organ_id_,#{organId})
    		</if>
   	</select>
+    <select id="countUserBuyVipGroupSuccessOrder" resultType="int">
+      select count(*) from student_payment_order where  user_id_=#{userId} and music_group_id_=#{vipGroupId} and group_type_='VIP' and status_='SUCCESS'
+    </select>
 </mapper>

+ 13 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -290,6 +290,19 @@
             </if>
         </where>
     </select>
+    <select id="findTeaTeachersByOrganAndSubject" resultMap="TeacherBasicDto">
+        SELECT
+            su.id_,
+            su.username_,
+            su.real_name_,
+            t.organ_id_
+        FROM
+            teacher t
+            LEFT JOIN sys_user su ON t.id_ = su.id_
+        WHERE
+            FIND_IN_SET(#{subjectId},t.subject_id_)
+            AND (t.organ_id_=#{organId} OR FIND_IN_SET(#{subjectId},t.flow_organ_range_))
+    </select>
     <select id="findTeacherByOrganAndSubject" resultMap="TeacherBasicDto">
         SELECT
             su.id_,

+ 23 - 1
mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Date;
+
 /**
  * @Author Joburgess
  * @Date 2020/1/31
@@ -28,6 +30,16 @@ public class PracticeGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @ApiOperation("获取学生的陪练课")
+    @GetMapping(value = "/findUserPracticeCourses")
+    public Object findUserPracticeCourses(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(practiceGroupService.findUserPracticeCourses(sysUser.getId()));
+    }
+
     @ApiOperation("获取陪练课预约参数")
     @GetMapping(value = "/getPracticeApplyParams")
     public Object getPracticeApplyParams(){
@@ -38,6 +50,16 @@ public class PracticeGroupController extends BaseController {
         return succeed(practiceGroupService.getPracticeApplyParams(sysUser.getId()));
     }
 
+    @ApiOperation("获取指定学员所在分部下的教师空闲时间")
+    @GetMapping(value = "/getTeacherFreeTimes")
+    public Object getTeacherFreeTimes(Integer subjectId, Date firstClassTime){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(practiceGroupService.getTeacherFreeTimes(sysUser.getId(),subjectId,firstClassTime));
+    }
+
     @ApiOperation("陪练课预约")
     @PostMapping(value = "/practiceApply")
     public Object practiceApply(PracticeGroup practiceGroup){
@@ -45,7 +67,7 @@ public class PracticeGroupController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        practiceGroup.setUserId(sysUser.getId());
+        practiceGroup.setStudentId(sysUser.getId());
         return succeed(practiceGroupService.practiceApply(practiceGroup));
     }