فهرست منبع

1、课表organ_id_字段初始化;
2、课表列表去除团体名和班级名,搜索更改为按团体编号/课程编号/课程名搜索
3、修复对外课程无部门编号
4、节假日获取方式调整
5、线上乐团课创建

Joe 5 سال پیش
والد
کامیت
0bda4eddbb
20فایلهای تغییر یافته به همراه590 افزوده شده و 20 حذف شده
  1. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  5. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  8. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  9. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/OnlineMusicGroupService.java
  10. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  11. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  12. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  13. 320 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java
  14. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  15. 23 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 6 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  17. 21 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  18. 13 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  19. 5 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  20. 73 17
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduOnlineMusicGroupController.java

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

@@ -1281,6 +1281,10 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<CourseSchedule> findUserCourses2(@Param("userId") Integer userId,
                                           @Param("teacherIds") List<Integer> teacherIds);
 
+
+    List<CourseSchedule> findUserCourses3(@Param("studentId") Integer studentId,
+                                          @Param("teacherIds") List<Integer> teacherIds);
+
     /**
      * @param userId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>

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

@@ -263,4 +263,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return java.util.List<java.util.Map<java.lang.Long,java.math.BigDecimal>>
      */
     List<Map<Long, BigDecimal>> findCoursePayment(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
+     * 获取学员指定课程类型的剩余课时数
+     * @param studentId
+     * @param courseScheduleType
+     * @return
+     */
+    int countStudentNotStartCourseNumWithCourseType(@Param("studentId") Integer studentId,
+                                                    @Param("type")CourseSchedule.CourseScheduleType courseScheduleType);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -182,6 +182,14 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<MusicGroup> findUserMusicGroups(@Param("userId") Integer userId);
 
     /**
+     * 查询乐团列表
+     * @param params
+     * @return
+     */
+    List<MusicGroup> findMusicGroups(Map<String, Object> params);
+    int countMusicGroups(Map<String, Object> params);
+
+    /**
      * 获取乐团信息
      *
      * @param list

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import java.util.List;
 
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -35,4 +36,13 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 	 */
 	List<MusicGroupPaymentCalenderDetail> queryByCalenderId(Long musicGroupPaymentCalenderId);
 
+	/**
+	 * 根据声部获取乐团下完成缴费的学员
+	 * @param musicGroupId
+	 * @param subjectId
+	 * @return
+	 */
+	List<SimpleUserDto> findMusicGroupStudentWithSubject(@Param("musicGroupId") String musicGroupId,
+														 @Param("subjectId") Integer subjectId);
+
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.entity.Subject;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -320,4 +321,11 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<String> queryStudentMusicGroup(Integer studentId);
 
     String getSubjectIds(Integer userId);
+
+    /**
+     * 获取乐团下所有学员身上的声部列表
+     * @param musicGroupId
+     * @return
+     */
+    List<Subject> findMusicGroupAllStudentSubjects(@Param("musicGroupId") String musicGroupId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java

@@ -20,6 +20,17 @@ public class MusicGroupQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "乐团状态",required = false)
     private String musicGroupStatus;
 
+    @ApiModelProperty(value = "教务老师编号")
+    private Integer educationalTeacherId;
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
     public String getOrganId() {
         return organId;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.common.service.BaseService;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long, MusicGroupPaymentCalenderDetail> {
 
@@ -20,4 +22,12 @@ public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long
      * @param ids
      */
     void openPayment(String ids);
+
+    /**
+     * 根据声部获取乐团下完成缴费的学员
+     * @param musicGroupId
+     * @param subjectId
+     * @return
+     */
+    List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId,Integer subjectId);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -165,6 +165,13 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	PageInfo<MusicGroup> queryMusicGroupPage(MusicGroupQueryInfo queryInfo);
 
 	/**
+	 * 获取乐团列表
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<MusicGroup> findEduTeacherMusicGroups(MusicGroupQueryInfo queryInfo);
+
+	/**
 	 * 修改乐团基本信息
 	 * @param subFeeSettingDto
 	 */

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/OnlineMusicGroupService.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.OnlineMusicGroupCourseDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.common.page.QueryInfo;
 
 import java.util.List;
+import java.util.Map;
 
 public interface OnlineMusicGroupService {
 
@@ -14,4 +16,22 @@ public interface OnlineMusicGroupService {
      */
     void createOnlineMusicClassGroup(OnlineMusicGroupCourseDto onlineMusicGroupCourseInfo);
 
+    /**
+     * @describe 获取可以预约的教师
+     * @author Joburgess
+     * @date 2020/2/9
+     * @param studentId: 学生编号
+     * @param subjectId: 声部编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+     */
+    List<SimpleUserDto> getEnableApplyTeachers(Integer studentId, Integer subjectId);
+
+    /**
+     * 获取教师空闲时间
+     * @param studentId
+     * @param teacherId
+     * @return
+     */
+    Map getTeacherFreeTimes(Integer studentId, Integer teacherId);
+
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -235,4 +235,11 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
 	 * @return
 	 */
 	List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId);
+
+	/**
+	 * 获取乐团下所有学员身上的声部列表
+	 * @param musicGroupId
+	 * @return
+	 */
+	List<Subject> findMusicGroupAllStudentSubjects(String musicGroupId);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -14,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -77,4 +79,12 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
 		//推送消息
 	}
+
+	@Override
+	public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
+		if(Objects.isNull(musicGroupId)){
+			throw new BizException("请指定乐团");
+		}
+		return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
+	}
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1858,6 +1858,26 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return musicGroupPageInfo;
     }
 
+    @Override
+    public PageInfo<MusicGroup> findEduTeacherMusicGroups(MusicGroupQueryInfo queryInfo) {
+        PageInfo<MusicGroup> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroup> dataList = null;
+        int count = musicGroupDao.countMusicGroups(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupDao.findMusicGroups(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
     private void updateTeamTeacher(MusicGroup oldMusicGroup, MusicGroup newMusicGroup) {
         //获取当前乐团所有班级
         List<ClassGroup> classGroups = classGroupDao.findClassGroups(newMusicGroup.getId());

+ 320 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java

@@ -1,13 +1,16 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.CourseTimeDto;
-import com.ym.mec.biz.dal.dto.OnlineMusicGroupCourseDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.EduPracticeGroupService;
 import com.ym.mec.biz.service.OnlineMusicGroupService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -18,10 +21,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.WeekFields;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -55,6 +62,12 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
     private TeacherAttendanceDao teacherAttendanceDao;
     @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TeacherFreeTimeDao teacherFreeTimeDao;
+    @Autowired
+    private EduPracticeGroupService eduPracticeGroupService;
 
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.DEFAULT)
     @Override
@@ -196,4 +209,308 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
         teacherAttendanceDao.batchInsert(teacherAttendances);
 
     }
+
+    @Override
+    public List<SimpleUserDto> getEnableApplyTeachers(Integer studentId, Integer subjectId) {
+        if (Objects.isNull(subjectId)) {
+            throw new BizException("请选择声部");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(studentId);
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(sysUser.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+
+        List<Integer> includeTeacherIds = new ArrayList<>();
+        List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject2(sysUser.getOrganId(), subjectId);
+        if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
+            return new ArrayList<>();
+        }
+
+        List<Integer> allTeacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
+
+        List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses2(studentId, allTeacherIds);
+
+        if (!CollectionUtils.isEmpty(userCourses)) {
+            Map<GroupType, List<CourseSchedule>> courseTypeCourseMap = userCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getGroupType));
+
+            List<CourseSchedule> practiceCourses = courseTypeCourseMap.get(GroupType.MUSIC);
+            if (!CollectionUtils.isEmpty(practiceCourses)) {
+                for (CourseSchedule practiceCourse : practiceCourses) {
+                    if (!includeTeacherIds.contains(practiceCourse.getTeacherId())) {
+                        includeTeacherIds.add(practiceCourse.getTeacherId());
+                    }
+                }
+            }
+
+            List<CourseSchedule> vipCourses = courseTypeCourseMap.get(GroupType.VIP);
+            if (!CollectionUtils.isEmpty(vipCourses)) {
+                for (CourseSchedule vipCourse : vipCourses) {
+                    if (!includeTeacherIds.contains(vipCourse.getTeacherId())) {
+                        includeTeacherIds.add(vipCourse.getTeacherId());
+                    }
+                }
+            }
+            List<CourseSchedule> singleCourses = courseTypeCourseMap.get(GroupType.MUSIC);
+            if (!CollectionUtils.isEmpty(singleCourses)) {
+                for (CourseSchedule singleCourse : singleCourses) {
+                    if (!includeTeacherIds.contains(singleCourse.getTeacherId())) {
+                        includeTeacherIds.add(singleCourse.getTeacherId());
+                    }
+                }
+            }
+        }
+
+        for (ExtendTeacherBasicDto organAndSubjectTeacher : organAndSubjectTeachers) {
+            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())
+                    && 1 == organAndSubjectTeacher.getIsSupportExtraPracticeLesson()) {
+                includeTeacherIds.add(organAndSubjectTeacher.getId());
+            }
+        }
+
+        if (CollectionUtils.isEmpty(new ArrayList<>(includeTeacherIds))) {
+            return new ArrayList<>();
+        }
+
+        List<SimpleUserDto> userInfos = new ArrayList<>();
+        Map<Integer, ExtendTeacherBasicDto> idTeacherMap = organAndSubjectTeachers.stream().collect(Collectors.toMap(ExtendTeacherBasicDto::getId, teacher -> teacher));
+        for (Integer includeTeacherId : includeTeacherIds) {
+            ExtendTeacherBasicDto teacher = idTeacherMap.get(includeTeacherId);
+            SimpleUserDto simpleUserDto=new SimpleUserDto(includeTeacherId, teacher.getRealName());
+            simpleUserDto.setAvatar(teacher.getAvatar());
+            simpleUserDto.setIntroduction(teacher.getIntroduction());
+            simpleUserDto.setSubjectNames(teacher.getSubjectNames());
+            userInfos.add(simpleUserDto);
+        }
+
+        return userInfos;
+    }
+
+    @Override
+    public Map getTeacherFreeTimes(Integer studentId, Integer teacherId) {
+        if (Objects.isNull(teacherId)) {
+            throw new BizException("请选择教师");
+        }
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+        if (Objects.isNull(student)) {
+            throw new BizException("用户不存在");
+        }
+        if (Objects.isNull(student.getOrganId())) {
+            throw new BizException("未找到用户分部属性");
+        }
+        Teacher teacher = teacherDao.get(teacherId);
+        if (Objects.isNull(teacher)) {
+            throw new BizException("教师不存在");
+        }
+        Map result = new HashMap();
+        Set<Integer> disableApplyWeekDay = new HashSet<>();
+
+        //课程时长暂时与网管课共用
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+
+        boolean checkTeacherLeaveDate = true;
+        SysConfig allTeacherLeaveDataConfig = sysConfigService.findByParamName(SysConfigService.TEACHER_LEAVE_DATA);
+        JSONObject allTeacherLeaveData = JSONObject.parseObject(allTeacherLeaveDataConfig.getParanValue());
+        if (Objects.isNull(allTeacherLeaveData)) {
+            checkTeacherLeaveDate = false;
+        }
+
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.findTeacherFreeTime(teacherId);
+        JSONObject teacherFreeTimes=new JSONObject();
+        int holiday = 0;
+        if (Objects.nonNull(teacherFreeTime)) {
+            if (Objects.nonNull(teacherFreeTime.getHoliday())) {
+                holiday = teacherFreeTime.getHoliday();
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getMonday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.MONDAY.getValue()), JSON.parseArray(teacherFreeTime.getMonday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.MONDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getTuesday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.TUESDAY.getValue()), JSON.parseArray(teacherFreeTime.getTuesday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.TUESDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getWednesday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.WEDNESDAY.getValue()), JSON.parseArray(teacherFreeTime.getWednesday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.WEDNESDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getThursday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.THURSDAY.getValue()), JSON.parseArray(teacherFreeTime.getThursday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.THURSDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getFriday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.FRIDAY.getValue()), JSON.parseArray(teacherFreeTime.getFriday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.FRIDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getSaturday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.SATURDAY.getValue()), JSON.parseArray(teacherFreeTime.getSaturday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.SATURDAY.getValue());
+            }
+            if(StringUtils.isNotBlank(teacherFreeTime.getSunday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.SUNDAY.getValue()), JSON.parseArray(teacherFreeTime.getSunday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.SUNDAY.getValue());
+            }
+        }
+
+        DateTimeFormatter ddtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        DateTimeFormatter ddf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
+        WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1);
+        ZoneId zoneId = ZoneId.systemDefault();
+
+        LocalDate startDay = LocalDate.now().plusDays(1);
+        LocalDate endDay = startDay.plusDays(14);
+
+        Map<Integer, List<String>> weekNumApplyTimesMap = eduPracticeGroupService.getEnableApplyDatesWithWeek(startDay.getDayOfWeek().getValue());
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRangeWithoutMusicGroup(teacherId, Date.from(startDay.atStartOfDay(zoneId).toInstant()), Date.from(endDay.atStartOfDay(zoneId).toInstant()));
+        allTeacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        JSONObject teacherLeaveData = null;
+        if (checkTeacherLeaveDate) {
+            teacherLeaveData = allTeacherLeaveData.getJSONObject(teacherId.toString());
+        }
+
+        if (Objects.isNull(teacherLeaveData)) {
+            checkTeacherLeaveDate = false;
+        }
+
+        weekNumApplyTimesMap.remove(holiday);
+
+        if (teacherId == 100473) {
+            List<String> timeStrs = weekNumApplyTimesMap.get(DateUtil.calendarWeekNumNormalWeekNumMap.get(Calendar.MONDAY));
+            LocalTime noonStartTime = LocalTime.parse("11:30:00", dtf);
+            LocalTime noonEndTime = LocalTime.parse("14:30:00", dtf);
+            LocalTime nightStartTime = LocalTime.parse("20:30:00", dtf);
+            LocalTime defaultApplyTime;
+            Iterator<String> iterator = timeStrs.iterator();
+            while (iterator.hasNext()) {
+                defaultApplyTime = LocalTime.parse(iterator.next(), dtf);
+                LocalTime defaultApplyEndTime = defaultApplyTime.plusMinutes(practiceCourseMinutes);
+                if (defaultApplyTime.compareTo(noonStartTime) <= 0
+                        && defaultApplyEndTime.compareTo(noonEndTime) >= 0) {
+                    iterator.remove();
+                    continue;
+                }
+                if (defaultApplyEndTime.compareTo(nightStartTime) < 0) {
+                    iterator.remove();
+                    continue;
+                }
+            }
+            weekNumApplyTimesMap.remove(DateUtil.calendarWeekNumNormalWeekNumMap.get(Calendar.SATURDAY));
+            weekNumApplyTimesMap.put(DateUtil.calendarWeekNumNormalWeekNumMap.get(Calendar.MONDAY), timeStrs);
+            weekNumApplyTimesMap.put(DateUtil.calendarWeekNumNormalWeekNumMap.get(Calendar.SUNDAY), timeStrs);
+        } else if (checkTeacherLeaveDate) {
+            for (String dateStr : teacherLeaveData.keySet()) {
+                LocalDate parse = LocalDate.parse(dateStr, ddf);
+                LocalDate tempDate = LocalDate.parse(dateStr, ddf);
+                if (tempDate.compareTo(startDay)<0
+                        ||tempDate.compareTo(tempDate)>=0){
+                    continue;
+                }
+                List<String> applyTimeStrs = weekNumApplyTimesMap.get(parse.getDayOfWeek().getValue());
+                if(CollectionUtils.isEmpty(applyTimeStrs)){
+                    continue;
+                }
+                Iterator<String> iterator = applyTimeStrs.iterator();
+                JSONObject leaveDateData = teacherLeaveData.getJSONObject(dateStr);
+                LocalTime leaveStartTime = LocalDateTime.parse(leaveDateData.getString("leave_start_time"), ddtf).toLocalTime();
+                LocalTime leaveEndTime = LocalDateTime.parse(leaveDateData.getString("leave_end_time"), ddtf).toLocalTime();
+                LocalTime defaultApplyTime;
+                while (iterator.hasNext()) {
+                    defaultApplyTime = LocalTime.parse(iterator.next(), dtf);
+                    LocalTime defaultApplyEndTime = defaultApplyTime.plusMinutes(practiceCourseMinutes);
+                    if (defaultApplyTime.compareTo(leaveEndTime) <= 0
+                            && defaultApplyEndTime.compareTo(leaveStartTime) >= 0) {
+                        iterator.remove();
+                        continue;
+                    }
+                }
+                if(!CollectionUtils.isEmpty(applyTimeStrs)){
+                    weekNumApplyTimesMap.put(parse.getDayOfWeek().getValue(), applyTimeStrs);
+                }else{
+                    weekNumApplyTimesMap.remove(parse.getDayOfWeek().getValue());
+                }
+            }
+        }
+
+        Iterator<Integer> weekNumApplyTimeIterator = weekNumApplyTimesMap.keySet().iterator();
+        while (weekNumApplyTimeIterator.hasNext()) {
+            Integer weekNum=weekNumApplyTimeIterator.next();
+            JSONArray teacherWeekDayFreeTimes = teacherFreeTimes.getJSONArray(String.valueOf(weekNum));
+            if(Objects.nonNull(teacherWeekDayFreeTimes)){
+                List<String> applyTimeStrs = weekNumApplyTimesMap.get(weekNum);
+                if(CollectionUtils.isEmpty(applyTimeStrs)){
+                    continue;
+                }
+                Iterator<String> iterator = applyTimeStrs.iterator();
+                while (iterator.hasNext()) {
+                    LocalTime enableApplyStartTime=LocalTime.parse(iterator.next(), dtf);
+                    LocalTime enableApplyEndTime=enableApplyStartTime.plusMinutes(practiceCourseMinutes);
+                    boolean isInclude=false;
+                    for (Object teacherWeekDayFreeTimeObject : teacherWeekDayFreeTimes) {
+                        JSONObject teacherWeekDayFreeTime=JSONObject.parseObject(teacherWeekDayFreeTimeObject.toString());
+                        LocalTime teacherFreeStartTime=LocalTime.parse(teacherWeekDayFreeTime.getString("startTime"),DateUtil.timeFormatter);
+                        LocalTime teacherFreeEndTime=LocalTime.parse(teacherWeekDayFreeTime.getString("endTime"),DateUtil.timeFormatter);
+                        if(enableApplyEndTime.compareTo(teacherFreeEndTime)<=0
+                                &&enableApplyStartTime.compareTo(teacherFreeStartTime)>=0){
+                            isInclude=true;
+                            break;
+                        }
+                    }
+                    if(!isInclude){
+                        iterator.remove();
+                    }
+                }
+                if(CollectionUtils.isEmpty(applyTimeStrs)){
+                    weekNumApplyTimeIterator.remove();
+                }else{
+                    weekNumApplyTimesMap.put(weekNum,applyTimeStrs);
+                }
+            }else{
+                weekNumApplyTimeIterator.remove();
+            }
+        }
+
+        if (CollectionUtils.isEmpty(allTeacherCourses)) {
+            result.put("teacherFreeDays", weekNumApplyTimesMap);
+            return result;
+        }
+
+        for (CourseSchedule teacherCourse : allTeacherCourses) {
+            LocalDateTime courseStartTime = LocalDateTime.ofInstant(teacherCourse.getStartClassTime().toInstant(), zoneId);
+            LocalDateTime courseEndTime = LocalDateTime.ofInstant(teacherCourse.getEndClassTime().toInstant(), zoneId);
+            List<String> applyTimeStrs = weekNumApplyTimesMap.get(courseStartTime.getDayOfWeek().getValue());
+            if (CollectionUtils.isEmpty(applyTimeStrs)) {
+                continue;
+            }
+            Iterator<String> iterator = applyTimeStrs.iterator();
+            LocalTime defaultApplyTime;
+            while (iterator.hasNext()) {
+                defaultApplyTime = LocalTime.parse(iterator.next(), dtf);
+                LocalTime defaultApplyEndTime = defaultApplyTime.plusMinutes(practiceCourseMinutes);
+                if (defaultApplyTime.compareTo(courseEndTime.toLocalTime()) <= 0
+                        && defaultApplyEndTime.compareTo(courseStartTime.toLocalTime()) >= 0) {
+                    iterator.remove();
+                    continue;
+                }
+            }
+            if(CollectionUtils.isEmpty(applyTimeStrs)){
+                weekNumApplyTimesMap.remove(courseStartTime.getDayOfWeek().getValue());
+            }else{
+                weekNumApplyTimesMap.put(courseStartTime.getDayOfWeek().getValue(), applyTimeStrs);
+            }
+        }
+        result.put("teacherFreeDays", weekNumApplyTimesMap);
+        return result;
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -1044,4 +1044,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return students;
     }
+
+    @Override
+    public List<Subject> findMusicGroupAllStudentSubjects(String musicGroupId) {
+        return studentRegistrationDao.findMusicGroupAllStudentSubjects(musicGroupId);
+    }
 }

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

@@ -2636,6 +2636,29 @@
         </foreach>
         AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
     </select>
+    <select id="findUserCourses3" resultMap="CourseSchedule">
+        SELECT
+        cs.id_,
+        cs.group_type_,
+        cgtm.`user_id_` teacher_id_
+        FROM
+        `class_group_student_mapper` cgsm
+        LEFT JOIN `class_group` cg ON cgsm.`class_group_id_` = cg.`id_`
+        LEFT JOIN `class_group_teacher_mapper` cgtm ON cgtm.`class_group_id_` = cg.`id_`
+        AND cgtm.`teacher_role_` = 'BISHOP'
+        LEFT JOIN `course_schedule` cs ON cs.`class_group_id_` = cg.`id_`
+        WHERE
+        cgsm.user_id_=#{userId}
+        AND cgtm.teacher_role_='BISHOP'
+        AND cgsm.status_ = 'NORMAL'
+        AND cg.group_type_ IN ( 'PRACTICE', 'MUSIC', 'VIP' )
+        AND cs.`id_` IS NOT NULL
+        AND cgtm.user_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+        AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
+    </select>
     <select id="findUserCoursesWithPay" resultMap="CourseSchedule">
         SELECT
         cs.id_,

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -429,4 +429,10 @@
 		GROUP BY
 			course_schedule_id_
     </select>
+    <select id="countStudentNotStartCourseNumWithCourseType" resultType="int">
+		SELECT COUNT(DISTINCT cssp.course_schedule_id_) FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
+		WHERE cssp.user_id_=#{studentId} AND cs.type_= #{courseScheduleType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		AND CONCAT(class_date_, ' ', start_class_time_)&gt;NOW()
+	</select>
 </mapper>

+ 21 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -417,4 +417,25 @@
 		</foreach>
 		GROUP BY sr.user_id_
 	</select>
+
+	<sql id="findMusicGroupsCondition">
+		<where>
+			<if test="educationalTeacherId!=null">
+				AND educational_teacher_id_=#{educationalTeacherId}
+			</if>
+			<if test="search!=null">
+				AND (id_=#{search} OR name_ LIKE CONCAT('%', #{name_}, '%'))
+			</if>
+		</where>
+	</sql>
+    <select id="findMusicGroups" resultMap="MusicGroup">
+		SELECT * FROM music_group
+		<include refid="findMusicGroupsCondition"/>
+		ORDER BY id_
+		<include refid="global.limit"/>
+	</select>
+	<select id="countMusicGroups" resultType="int">
+		SELECT COUNT(id_) FROM music_group
+		<include refid="findMusicGroupsCondition"/>
+	</select>
 </mapper>

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

@@ -182,4 +182,17 @@
 	<select id="queryByCalenderId" resultMap="MusicGroupPaymentCalenderDetail">
 		SELECT * FROM music_group_payment_calender_detail where music_group_payment_calender_id_ = #{calenderId}
 	</select>
+    <select id="findMusicGroupStudentWithSubject" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
+		SELECT
+		DISTINCT su.id_ userId,su.username_ userName, su.avatar_ avatar, su.phone_ phone
+		FROM music_group_payment_calender_detail mgpcd
+		LEFT JOIN student_registration sr ON sr.user_id_=mgpcd.user_id_
+		LEFT JOIN sys_user su ON su.id_=mgpcd.user_id_
+		WHERE sr.music_group_id_=#{musicGroupId}
+		AND sr.subject_id_= #{subjectId}
+		AND music_group_payment_calender_id_ IN
+		(SELECT id_ FROM (SELECT id_ FROM music_group_payment_calender
+		WHERE music_group_id_=#{musicGroupId} AND payment_status_ IN ('PAID_COMPLETED', 'PROCESSING')
+		ORDER BY start_payment_date_ DESC LIMIT 1) t);
+	</select>
 </mapper>

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -608,4 +608,9 @@
         WHERE sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{userId}
         GROUP BY sr.user_id_
     </select>
+    <select id="findMusicGroupAllStudentSubjects" resultMap="com.ym.mec.biz.dal.dao.SubjectDao.Subject">
+        SELECT DISTINCT s.* FROM student_registration sr
+        LEFT JOIN subject s ON sr.subject_id_=s.id_
+        WHERE sr.music_group_id_=#{musicGroupId};
+    </select>
 </mapper>

+ 73 - 17
mec-web/src/main/java/com/ym/mec/web/controller/education/EduOnlineMusicGroupController.java

@@ -2,25 +2,34 @@ package com.ym.mec.web.controller.education;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.OnlineMusicGroupCourseDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
 import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.OnlineMusicGroupService;
+import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 @RequestMapping("eduOnlineMusic")
 @Api(tags = "教务端乐团网管课")
@@ -34,34 +43,81 @@ public class EduOnlineMusicGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+    @Autowired
     private EmployeeDao employeeDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
     @ApiOperation(value = "分页查询乐团列表")
-    @GetMapping("/queryPage")
-    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/queryPage')")
-    public Object queryPage(MusicGroupQueryInfo queryInfo) {
+    @GetMapping("/findMusicGroups")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/findMusicGroups')")
+    public HttpResponseResult findMusicGroups(MusicGroupQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-        if(!sysUser.getIsSuperAdmin()){
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
-                queryInfo.setOrganId(employee.getOrganIdList());
-            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
-                return failed("用户所在分部异常");
-            }else {
-                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-                    return failed("非法请求");
-                }
-            }
+        queryInfo.setEducationalTeacherId(sysUser.getId());
+        return succeed(musicGroupService.findEduTeacherMusicGroups(queryInfo));
+    }
+
+    @ApiOperation(value = "获取乐团下所有学员身上的声部列表")
+    @GetMapping("/findMusicGroupAllStudentSubjects")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/findMusicGroupAllStudentSubjects')")
+    public HttpResponseResult findMusicGroupAllStudentSubjects(String musicGroupId){
+        return succeed(studentRegistrationService.findMusicGroupAllStudentSubjects(musicGroupId));
+    }
+
+    @ApiOperation(value = "根据声部获取乐团下完成缴费的学员")
+    @GetMapping("/findMusicGroupStudentWithSubject")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/findMusicGroupStudentWithSubject')")
+    public HttpResponseResult findMusicGroupStudentWithSubject(String musicGroupId,Integer subjectId){
+        if(Objects.isNull(subjectId)){
+            return failed("请指定声部");
         }
-        return succeed(musicGroupService.queryMusicGroupPage(queryInfo));
+        return succeed(musicGroupPaymentCalenderDetailService.findMusicGroupStudentWithSubject(musicGroupId, subjectId));
+    }
+
+    @ApiOperation(value = "获取可选择的教师")
+    @GetMapping("/getEnableApplyTeachers")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/getEnableApplyTeachers')")
+    public HttpResponseResult getEnableApplyTeachers(Integer studentId, Integer subjectId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if(Objects.isNull(studentId)){
+            throw new BizException("请指定学生");
+        }
+        return succeed(onlineMusicGroupService.getEnableApplyTeachers(studentId, subjectId));
+    }
+
+    @ApiOperation(value = "获取教师空闲时间")
+    @GetMapping("/getTeacherFreeTimes")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/getTeacherFreeTimes')")
+    public HttpResponseResult getTeacherFreeTimes(Integer studentId, Integer teacherId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if(Objects.isNull(studentId)){
+            throw new BizException("请指定学生");
+        }
+        return succeed(onlineMusicGroupService.getTeacherFreeTimes(studentId,teacherId));
+    }
+
+    @ApiOperation(value = "检测学生是否存在进行中的乐团网管课")
+    @GetMapping("/checkStudentExistMusicNetwork")
+    @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/checkStudentExistMusicNetwork')")
+    public HttpResponseResult checkStudentExistMusicNetwork(Integer studentId){
+        int i = courseScheduleStudentPaymentDao.countStudentNotStartCourseNumWithCourseType(studentId, CourseSchedule.CourseScheduleType.MUSIC_NETWORK);
+        return succeed(i>0?1:0);
     }
 
     @ApiOperation(value = "创建乐团网管课")
-    @GetMapping("/createOnlineMusicClassGroup")
+    @PostMapping("/createOnlineMusicClassGroup")
     @PreAuthorize("@pcs.hasPermissions('eduOnlineMusic/createOnlineMusicClassGroup')")
     public HttpResponseResult createOnlineMusicClassGroup(OnlineMusicGroupCourseDto onlineMusicGroupCourseInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();