Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 5 năm trước cách đây
mục cha
commit
455998fcb6
37 tập tin đã thay đổi với 1008 bổ sung163 xóa
  1. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherSalaryDao.java
  3. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  5. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  6. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  7. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDefaultVipGroupSalaryDao.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  10. 93 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  11. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java
  12. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Subject.java
  14. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  15. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  16. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  17. 421 74
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  19. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  20. 124 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  21. 12 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  22. 3 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  23. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  24. 3 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml
  25. 4 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherSalaryMapper.xml
  26. 56 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 3 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  28. 4 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  29. 3 3
      mec-biz/src/main/resources/config/mybatis/GroupMapper.xml
  30. 1 2
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  31. 6 2
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  32. 7 0
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  33. 8 0
      mec-biz/src/main/resources/config/mybatis/TeacherDefaultVipGroupSalaryMapper.xml
  34. 7 1
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  35. 74 9
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  36. 47 0
      mec-util/src/main/java/com/ym/mec/util/collection/ListUtil.java
  37. 3 2
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

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

@@ -99,4 +99,15 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
      * @param teacherId
      */
     void updateTeacher(@Param("classGroupIds") Set<Integer> classGroupIds, @Param("teacherId") Integer teacherId);
+
+    /**
+     * @describe 根据团体删除班级
+     * @author Joburgess
+     * @date 2020/2/17
+     * @param groupId:
+     * @param groupType:
+     * @return int
+     */
+    int deleteByGroup(@Param("groupId") String groupId,
+                      @Param("groupType")GroupType groupType);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherSalaryDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
@@ -45,4 +46,15 @@ public interface ClassGroupTeacherSalaryDao extends BaseDAO<Long, ClassGroupTeac
      * @param teacherId
      */
     void updateTeacher(@Param("classGroupIds") Set<Integer> classGroupIds, @Param("teacherId") Integer teacherId);
+
+    /**
+     * @describe 根据团体删除班级
+     * @author Joburgess
+     * @date 2020/2/17
+     * @param groupId:
+     * @param groupType:
+     * @return int
+     */
+    int deleteByGroup(@Param("groupId") String groupId,
+                      @Param("groupType") GroupType groupType);
 }

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

@@ -217,6 +217,17 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     int deleteCourseSchedulesByMusicGroupID(@Param("musicGroupId")String musicGroupId, @Param("groupType")GroupType groupType);
 
     /**
+     * @describe 根据团体删除班级
+     * @author Joburgess
+     * @date 2020/2/17
+     * @param groupId:
+     * @param groupType:
+     * @return int
+     */
+    int deleteByGroup(@Param("groupId") String groupId,
+                      @Param("groupType")GroupType groupType);
+
+    /**
      * 逻辑删除乐团课程
      * @param musicGroupID
      * @return
@@ -951,6 +962,12 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                     @Param("groupId") String groupId);
 
     /**
+     * @describe 获取未开始的课程
+     * @param courseScheduleId
+     */
+    CourseSchedule getSurplusCourseWithGroup(@Param("courseScheduleId") Long courseScheduleId);
+
+    /**
      * @describe 统计班级上已结束课时数
      * @author Joburgess
      * @date 2019/12/25
@@ -1144,6 +1161,16 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                          @Param("teacherIds") List<Integer> teacherIds);
 
     /**
+     * @describe 获取学生相关的课程
+     * @author Joburgess
+     * @date 2020/2/10
+     * @param userId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
+    List<CourseSchedule> findUserCoursesWithPay(@Param("userId") Integer userId,
+                                         @Param("teacherIds") List<Integer> teacherIds);
+
+    /**
      * 获取课程实际上课老师
      * @param courseScheduleIds
      * @return

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

@@ -210,4 +210,15 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     Integer countStudentNum(Integer courseScheduleId);
+
+    /**
+     * @describe 根据团体删除班级
+     * @author Joburgess
+     * @date 2020/2/17
+     * @param groupId:
+     * @param groupType:
+     * @return int
+     */
+    int deleteByGroup(@Param("groupId") String groupId,
+                      @Param("groupType")GroupType groupType);
 }

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -153,7 +153,7 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @author Joburgess
 	 * @date 2019/10/24
 	 */
-	List<Map<Integer, BigDecimal>> findCourseSubsidyByCourses(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+	List<Map<Long, BigDecimal>> findCourseSubsidyByCourses(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
 	/**
 	 * 乐团详情--课酬调整--课程教师列表
@@ -297,4 +297,15 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 												   @Param("groupType") GroupType groupType);
 
     void batchUpdateTeacher(@Param("courseScheduleIds") Set<Long> courseScheduleIds, @Param("teacherId") Integer teacherId);
+
+	/**
+	 * @describe 根据团体删除班级
+	 * @author Joburgess
+	 * @date 2020/2/17
+	 * @param groupId:
+	 * @param groupType:
+	 * @return int
+	 */
+	int deleteByGroup(@Param("groupId") String groupId,
+					  @Param("groupType")GroupType groupType);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -33,7 +33,7 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @param courseId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
      */
-    List<StudentAttendance> findByCourseId(@Param("courseId") Integer courseId);
+    List<StudentAttendance> findByCourseId(@Param("courseId") Long courseId);
 
     /**
      * @describe 根据课程删除对应的点名记录

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -137,6 +137,8 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * @return
 	 */
 	int deleteByMusicGroupId(@Param("musicGroupId")String musicGroupId, @Param("groupType")GroupType groupType);
+	
+	int deletebyCourseScheduleId(@Param("courseScheduleId") Long courseScheduleId);
 
 	/**
 	 * @describe 清空指定课程教师签到信息
@@ -170,4 +172,15 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * @param teacherId
 	 */
     void batchUpdateTeacher(@Param("courseScheduleIds") Set<Long> courseScheduleIds, @Param("teacherId") Integer teacherId);
+
+	/**
+	 * @describe 根据团体删除班级
+	 * @author Joburgess
+	 * @date 2020/2/17
+	 * @param groupId:
+	 * @param groupType:
+	 * @return int
+	 */
+	int deleteByGroup(@Param("groupId") String groupId,
+					  @Param("groupType")GroupType groupType);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDefaultVipGroupSalaryDao.java

@@ -29,4 +29,6 @@ public interface TeacherDefaultVipGroupSalaryDao extends BaseDAO<Long, TeacherDe
     void batchAdd(@Param("vipGroupSalaries") List<TeacherDefaultVipGroupSalary> teacherDefaultVipGroupSalaries);
     
     List<TeacherDefaultVipGroupSalary> queryByUserId(Integer userId);
+    
+    List<TeacherDefaultVipGroupSalary> queryByUserIdList(@Param("userIdList") List<Integer> userIdList);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java

@@ -243,7 +243,7 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
      * @author Joburgess
      * @date 2019/10/23
      */
-    VipGroup findByCourseSchedule(Integer courseScheduleId);
+    VipGroup findByCourseSchedule(Long courseScheduleId);
 
     /**
      * 查询vip课数目

+ 93 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java

@@ -0,0 +1,93 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/2/18
+ */
+public class PracticeBuyResultDto {
+
+    private String orderNo;
+
+    private DealStatusEnum status;
+
+    private BigDecimal price;
+
+    private Date createTime;
+
+    private String teacherName;
+
+    private Date courseStartTime;
+
+    private Date courseEndTime;
+
+    private String drillTimesJson;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public DealStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(DealStatusEnum status) {
+        this.status = status;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Date getCourseStartTime() {
+        return courseStartTime;
+    }
+
+    public void setCourseStartTime(Date courseStartTime) {
+        this.courseStartTime = courseStartTime;
+    }
+
+    public Date getCourseEndTime() {
+        return courseEndTime;
+    }
+
+    public void setCourseEndTime(Date courseEndTime) {
+        this.courseEndTime = courseEndTime;
+    }
+
+    public String getDrillTimesJson() {
+        return drillTimesJson;
+    }
+
+    public void setDrillTimesJson(String drillTimesJson) {
+        this.drillTimesJson = drillTimesJson;
+    }
+}

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java

@@ -14,15 +14,15 @@ public class StudentAttendanceDto {
 
     private Integer update;
 
-    private Integer courseScheduleId;
+    private Long courseScheduleId;
 
     private List<StudentAttendance> studentAttendances;
 
-    public Integer getCourseScheduleId() {
+    public Long getCourseScheduleId() {
         return courseScheduleId;
     }
 
-    public void setCourseScheduleId(Integer courseScheduleId) {
+    public void setCourseScheduleId(Long courseScheduleId) {
         this.courseScheduleId = courseScheduleId;
     }
 

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -6,13 +6,16 @@ import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.common.enums.BaseEnum;
+
 import io.swagger.annotations.ApiModelProperty;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -102,7 +105,7 @@ public class CourseSchedule {
 	private Integer actualTeacherId;
 
 	@ApiModelProperty(value = "助教编号列表")
-	private List<Integer> teachingTeacherIdList;
+	private List<Integer> teachingTeacherIdList = new ArrayList<Integer>();
 
 	/**  */
 	private java.util.Date createTime;

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Subject.java

@@ -29,6 +29,9 @@ public class Subject {
 	@ApiModelProperty(value = "父级编号",required = false)
 	private Integer parentSubjectId;
 	
+	@ApiModelProperty(value = "图片地址",required = false)
+	private String img;
+	
 	/**  */
 	private java.util.Date createTime;
 	
@@ -119,6 +122,14 @@ public class Subject {
 		this.delFlag = delFlag;
 	}
 
+	public String getImg() {
+		return img;
+	}
+
+	public void setImg(String img) {
+		this.img = img;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -11,6 +11,7 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	SPORADIC("SPORADIC", "零星收费"),
 	OTHER("OTHER", "其他"),
 	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "小课购买"),
+	PRACTICE_GROUP_BUY("PRACTICE_GROUP_BUY", "陪练课购买"),
 	LUCK("LUCK", "福袋活动");
 
 	private String code;

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java

@@ -187,4 +187,13 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	 * @return java.util.List<com.ym.mec.biz.dal.dto.PracticeCourseDto>
 	 */
 	List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId);
+
+	/**
+	 * @describe 查询订单信息
+	 * @author Joburgess
+	 * @date 2020/2/18
+	 * @param orderNo: 订单编号
+	 * @return com.ym.mec.biz.dal.dto.PracticeBuyResultDto
+	 */
+	PracticeBuyResultDto queryOrderInfo(String orderNo);
 }

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

@@ -411,7 +411,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
 
         //获取课程对应教学点补贴
-        List<Map<Integer, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
         Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
         //课程对应乐团结算方式集合

+ 421 - 74
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -1,44 +1,136 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.commons.collections.ListUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.alibaba.fastjson.JSON;
 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.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.*;
-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.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleComplaintsDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleModifyLogDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.GroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.PracticeGroupDao;
+import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TeacherDefaultMusicGroupSalaryDao;
+import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
+import com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto;
+import com.ym.mec.biz.dal.dto.CoursePostponeDto;
+import com.ym.mec.biz.dal.dto.CourseScheduleDto;
+import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentDto;
+import com.ym.mec.biz.dal.dto.CourseTimeDto;
+import com.ym.mec.biz.dal.dto.CreateCourseScheduleDto;
+import com.ym.mec.biz.dal.dto.IntegerAndIntegerListDto;
+import com.ym.mec.biz.dal.dto.Mapper;
+import com.ym.mec.biz.dal.dto.StudentNameAndPhoneDto;
+import com.ym.mec.biz.dal.dto.TeacherAttendanceDto;
+import com.ym.mec.biz.dal.dto.TeacherBasicDto;
+import com.ym.mec.biz.dal.dto.TeacherClassCourseSchudeleDto;
+import com.ym.mec.biz.dal.dto.VipGroupApplyBaseInfoDto;
+import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
+import com.ym.mec.biz.dal.dto.VipGroupCourseAdjustInfoDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary;
+import com.ym.mec.biz.dal.entity.CourseGenerateDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
+import com.ym.mec.biz.dal.entity.CourseScheduleComplaints;
+import com.ym.mec.biz.dal.entity.CourseScheduleModifyLog;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.Group;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.entity.StudentCourseScheduleRecordDto;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TeacherAttendance;
+import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
+import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
+import com.ym.mec.biz.dal.entity.VipGroup;
+import com.ym.mec.biz.dal.enums.AuditStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.ParamEnum;
+import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.jiari.JiaRiFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.ym.mec.util.collection.ListUtil;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-import feign.codec.DecodeException;
-import org.apache.commons.collections.ListUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
+import com.ym.mec.util.json.JsonUtil;
 
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+import feign.codec.DecodeException;
 
 @Service
 public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSchedule> implements CourseScheduleService {
@@ -68,6 +160,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Autowired
     private TeacherDefaultVipGroupSalaryDao teacherDefaultVipGroupSalaryDao;
     @Autowired
+    private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
     private ClassGroupTeacherMapperService classGroupTeacherMapperService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
@@ -1553,30 +1647,26 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Transactional(rollbackFor = Exception.class)
     public void courseAdjust(List<CourseSchedule> newCourseSchedules) {
         Date now = new Date();
-        //课程信息处理
-        List<Long> courseScheduleIds = newCourseSchedules.stream()
-                .map(CourseSchedule::getId)
-                .distinct().collect(Collectors.toList());
-        List<CourseSchedule> oldCourseScheduleIds = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
-        Map<Long, List<CourseSchedule>> oldCourseScheduleMap = oldCourseScheduleIds.stream()
-                .collect(Collectors.groupingBy(CourseSchedule::getId));
-        List<Map<Long, Integer>> courseSettlementMaps = courseScheduleTeacherSalaryDao.checkCoursesIsSettlement(courseScheduleIds);
-        Map<Long, Long> courseSettlementMap = MapUtil.convertIntegerMap(courseSettlementMaps);
-
-        newCourseSchedules.forEach(newCourseSchedule -> {
-            Long isSettlement = courseSettlementMap.get(newCourseSchedule.getId().longValue());
-            if (Objects.nonNull(isSettlement) && isSettlement > 0) {
-                throw new BizException("调整的课程中存在已结算的课程");
-            }
-            List<CourseSchedule> oldCourseSchedules = oldCourseScheduleMap.get(newCourseSchedule.getId());
-            oldCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime).reversed());
-            CourseSchedule oldCourseSchedule = oldCourseSchedules.get(0);
-            if (Objects.isNull(newCourseSchedule.getActualTeacherId())) {
-                newCourseSchedule.setActualTeacherId(oldCourseSchedule.getActualTeacherId());
-            }
-            if (Objects.isNull(newCourseSchedule.getSchoolId())) {
-                newCourseSchedule.setSchoolId(oldCourseSchedule.getSchoolId());
-            }
+		// 课程信息处理
+		List<Long> courseScheduleIds = newCourseSchedules.stream().map(CourseSchedule::getId).distinct().collect(Collectors.toList());
+        
+        //已结算的课不能调整
+        /*List<Map<Long, Integer>> courseSettlementMaps = courseScheduleTeacherSalaryDao.checkCoursesIsSettlement(courseScheduleIds);
+        if(courseSettlementMaps!=null && courseSettlementMaps.size()>0){
+        	throw new BizException("调整的课程中存在已结算的课程");
+        }*/
+		
+        //查询数据库中的课程信息
+        List<CourseSchedule> oldCourseScheduleList = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
+        
+		Map<Long, CourseSchedule> oldCourseScheduleMap = oldCourseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c));
+		
+        for(CourseSchedule newCourseSchedule : newCourseSchedules){
+
+        	//获取数据库中的记录
+            CourseSchedule oldCourseSchedule = oldCourseScheduleMap.get(newCourseSchedule.getId());
+            
+            //课程是否已结算
             int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(oldCourseSchedule.getId().intValue());
             if (settlementNum > 0) {
                 throw new BizException("{}[{}]{}-{}课程已结算的",
@@ -1587,23 +1677,61 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                         DateUtil.dateToString(oldCourseSchedule.getEndClassTime(),
                                 DateUtil.EXPANDED_DATE_TIME_FORMAT));
             }
-            int num = studentAttendanceDao.countStudentAttendenceNum(oldCourseSchedule.getId().intValue());
-            if (num > 0) {
-                throw new BizException("{}[{}] {}-{}课程已点名",
-                        oldCourseSchedule.getName(),
-                        oldCourseSchedule.getId(),
-                        DateUtil.dateToString(oldCourseSchedule.getStartClassTime(),
-                                DateUtil.EXPANDED_DATE_TIME_FORMAT),
-                        DateUtil.dateToString(oldCourseSchedule.getEndClassTime(),
-                                DateUtil.EXPANDED_DATE_TIME_FORMAT));
+            //学生已点名不能调整(请假可以调整)
+            List<StudentAttendance> studentAttendanceList = studentAttendanceDao.findByCourseId(oldCourseSchedule.getId());
+            
+            for(StudentAttendance studentAttendance : studentAttendanceList){
+            	if(studentAttendance.getStatus() != StudentAttendanceStatusEnum.LEAVE){
+            		throw new BizException("{}[{}] {}-{}课程已点名",
+                            oldCourseSchedule.getName(),
+                            oldCourseSchedule.getId(),
+                            DateUtil.dateToString(oldCourseSchedule.getStartClassTime(),
+                                    DateUtil.EXPANDED_DATE_TIME_FORMAT),
+                            DateUtil.dateToString(oldCourseSchedule.getEndClassTime(),
+                                    DateUtil.EXPANDED_DATE_TIME_FORMAT));
+            	}
+            }
+
+            if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
+                if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
+                    throw new BizException("主教和助教不可重复");
+                }
+            }
+            
+            if(newCourseSchedule.getStatus() == oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.OVER){
+            	throw new BizException("已结束的课程需要调整课程状态");
             }
-            if (oldCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.VIP)) {
+            
+			if (newCourseSchedule.getGroupType() == GroupType.VIP) {
+				if (newCourseSchedule.getTeachMode() != oldCourseSchedule.getTeachMode() && newCourseSchedule.getTeachMode() == TeachModeEnum.OFFLINE) {
+					throw new BizException("不允许将线上课调整为线下课");
+				}
+			}
+            
+            /*if (oldCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.VIP)) {
                 VipGroup vipGroup = vipGroupDao.get(Long.valueOf(oldCourseSchedule.getMusicGroupId()));
                 if(Objects.isNull(vipGroup)){
                     throw new BizException("课程不存在");
                 }
                 Date endClassTime = DateUtil.addMinutes(newCourseSchedule.getStartClassTime(), vipGroup.getSingleClassMinutes());
                 newCourseSchedule.setEndClassTime(endClassTime);
+            }*/
+
+            if (Objects.isNull(newCourseSchedule.getActualTeacherId())) {
+                newCourseSchedule.setActualTeacherId(oldCourseSchedule.getActualTeacherId());
+            }
+            if (Objects.isNull(newCourseSchedule.getSchoolId())) {
+                newCourseSchedule.setSchoolId(oldCourseSchedule.getSchoolId());
+            }
+            if (Objects.isNull(newCourseSchedule.getType())) {
+                newCourseSchedule.setType(oldCourseSchedule.getType());
+            }
+            if(Objects.isNull(newCourseSchedule.getStartClassTime())){
+                newCourseSchedule.setStartClassTime(oldCourseSchedule.getStartClassTime());
+            }
+            if(newCourseSchedule.getEndClassTime() == null){
+            	int minutes = DateUtil.minutesBetween(oldCourseSchedule.getStartClassTime(), oldCourseSchedule.getEndClassTime());
+            	newCourseSchedule.setEndClassTime(DateUtil.addMinutes(newCourseSchedule.getStartClassTime(), minutes));
             }
             if(Objects.isNull(newCourseSchedule.getClassGroupId())){
                 newCourseSchedule.setClassGroupId(oldCourseSchedule.getClassGroupId());
@@ -1614,12 +1742,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if(Objects.isNull(newCourseSchedule.getClassDate())){
                 newCourseSchedule.setClassDate(oldCourseSchedule.getClassDate());
             }
-            if(Objects.isNull(newCourseSchedule.getStartClassTime())){
-                newCourseSchedule.setStartClassTime(oldCourseSchedule.getStartClassTime());
-            }
-            if(Objects.isNull(newCourseSchedule.getEndClassTime())){
-                newCourseSchedule.setEndClassTime(oldCourseSchedule.getEndClassTime());
-            }
             if (newCourseSchedule.getStartClassTime().after(now)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
             }
@@ -1629,16 +1751,241 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if (newCourseSchedule.getEndClassTime().before(now)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.OVER);
             }
-            if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
-                if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
-                    throw new BizException("主教和助教不可重复");
-                }
-            }
-        });
+        
+        }
+        
         //课程冲突检测
         checkNewCourseSchedules(newCourseSchedules, false);
-        //课程调整
-        classStartDateAdjust(newCourseSchedules);
+
+		Map<Long, List<TeacherAttendance>> teacherAttendanceMap = new HashMap<Long, List<TeacherAttendance>>();
+		// 查询老师的考勤
+		List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
+
+		for (TeacherAttendance ta : teacherAttendances) {
+			List<TeacherAttendance> tas = teacherAttendanceMap.get(ta.getCourseScheduleId());
+			if (tas == null) {
+				tas = new ArrayList<TeacherAttendance>();
+			}
+			tas.add(ta);
+			teacherAttendanceMap.put(ta.getCourseScheduleId(), tas);
+		}
+
+		Date date = new Date();
+		Long courseScheduleId = null;
+		List<TeacherAttendance> insertTeacherAttendanceList = new ArrayList<TeacherAttendance>();
+		List<CourseScheduleTeacherSalary> insertCourseScheduleTeacherSalaryList = new ArrayList<CourseScheduleTeacherSalary>();
+
+		// 获取课程对应教学点补贴
+		List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+		Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+
+		// 课程对应乐团结算方式集合
+		List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
+		Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
+
+		Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
+
+		List<CourseScheduleModifyLog> insertCourseScheduleModifyLogList = new ArrayList<CourseScheduleModifyLog>();
+
+		for (CourseSchedule newCourseSchedule : newCourseSchedules) {
+			courseScheduleId = newCourseSchedule.getId();
+			CourseSchedule oldCourseSchedule = oldCourseScheduleMap.get(courseScheduleId);
+
+			// 修改了主教/助教/课程状态,需修改考勤记录
+			List<TeacherAttendance> teacherAttendanceList = teacherAttendanceMap.get(courseScheduleId);
+
+			List<Integer> oldTeacherIdList = teacherAttendanceList.stream().map(TeacherAttendance::getTeacherId).distinct().collect(Collectors.toList());
+
+			List<Integer> newTeacherIdList = newCourseSchedule.getTeachingTeacherIdList();
+			newTeacherIdList.add(newCourseSchedule.getActualTeacherId());
+
+			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)
+					|| !ListUtil.isEquals(oldTeacherIdList, newTeacherIdList)) {
+				// 清理原来考勤
+				teacherAttendanceDao.deletebyCourseScheduleId(courseScheduleId);
+
+				// 新增考勤
+				for (Integer teacherId : newTeacherIdList) {
+					TeacherAttendance ta = new TeacherAttendance();
+					ta.setClassGroupId(newCourseSchedule.getClassGroupId());
+					ta.setCourseScheduleId(courseScheduleId);
+					ta.setCreateTime(date);
+					ta.setGroupType(newCourseSchedule.getGroupType());
+					ta.setMusicGroupId(newCourseSchedule.getMusicGroupId());
+					ta.setTeacherId(teacherId);
+					insertTeacherAttendanceList.add(ta);
+				}
+			}
+			
+			//如果已结束修改成了未开始,需要更新学生考勤记录
+			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
+				studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
+			}
+
+			// 计算课程时长
+			int oldMinutes = DateUtil.minutesBetween(oldCourseSchedule.getStartClassTime(), oldCourseSchedule.getEndClassTime());
+			int newMinutes = DateUtil.minutesBetween(newCourseSchedule.getStartClassTime(), newCourseSchedule.getEndClassTime());
+
+			// 如果修改了老师、课程类型、课程时长、教学模式,需要修改课酬
+			if (!ListUtil.isEquals(oldTeacherIdList, newTeacherIdList) || newCourseSchedule.getType() != oldCourseSchedule.getType()
+					|| newCourseSchedule.getTeachMode() != oldCourseSchedule.getTeachMode() || oldMinutes != newMinutes) {
+
+				// 所有教师列表
+				List<Teacher> teachers = teacherDao.findByTeacherIds(newTeacherIdList);
+				Map<Integer, Teacher> teacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
+
+				Map<Integer, Map<CourseScheduleType, TeacherDefaultMusicGroupSalary>> musicGroupSalaryMap = new HashMap<Integer, Map<CourseScheduleType, TeacherDefaultMusicGroupSalary>>();
+				// 所有老师默认乐团课酬
+				List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(newTeacherIdList);
+				for (TeacherDefaultMusicGroupSalary tdms : teacherDefaultMusicGroupSalaries) {
+					Map<CourseScheduleType, TeacherDefaultMusicGroupSalary> map = musicGroupSalaryMap.get(tdms.getUserId());
+					if (map == null) {
+						map = new HashMap<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary>();
+					}
+					map.put(tdms.getCourseScheduleType(), tdms);
+					musicGroupSalaryMap.put(tdms.getUserId(), map);
+				}
+
+				// 所有老师默认vip课酬
+				List<TeacherDefaultVipGroupSalary> teacherDefaultVipGroupSalaries = teacherDefaultVipGroupSalaryDao.queryByUserIdList(newTeacherIdList);
+				Map<Integer, Map<Integer, TeacherDefaultVipGroupSalary>> vipGroupSalaryMap = new HashMap<Integer, Map<Integer, TeacherDefaultVipGroupSalary>>();
+				for (TeacherDefaultVipGroupSalary tdvs : teacherDefaultVipGroupSalaries) {
+					Map<Integer, TeacherDefaultVipGroupSalary> map = vipGroupSalaryMap.get(tdvs.getUserId());
+					if (map == null) {
+						map = new HashMap<Integer, TeacherDefaultVipGroupSalary>();
+					}
+					map.put(tdvs.getVipGroupCategoryId(), tdvs);
+					vipGroupSalaryMap.put(tdvs.getUserId(), map);
+				}
+
+				VipGroup vipGroup = vipGroupDao.findByCourseSchedule(courseScheduleId);
+
+				// 删除课酬
+				List<Long> courseScheduleIdList = new ArrayList<Long>();
+				courseScheduleIdList.add(courseScheduleId);
+				courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIdList);
+
+				for (Integer teacherId : newTeacherIdList) {
+					CourseScheduleTeacherSalary ts = new CourseScheduleTeacherSalary();
+					ts.setClassGroupId(newCourseSchedule.getClassGroupId());
+					ts.setCourseScheduleId(courseScheduleId);
+					ts.setCreateTime(date);
+					ts.setGroupType(newCourseSchedule.getGroupType());
+					ts.setMusicGroupId(newCourseSchedule.getMusicGroupId());
+					ts.setSubsidy(courseSubsidyMap.get(courseScheduleId));
+					if (teacherId == newCourseSchedule.getActualTeacherId().intValue()) {
+						ts.setTeacherRole(TeachTypeEnum.BISHOP);
+					} else {
+						ts.setTeacherRole(TeachTypeEnum.TEACHING);
+					}
+					ts.setUpdateTime(date);
+					ts.setUserId(teacherId);
+					// 重新生成课酬
+					if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
+						Map<CourseScheduleType, TeacherDefaultMusicGroupSalary> map = musicGroupSalaryMap.get(teacherId);
+						TeacherDefaultMusicGroupSalary tdms = map.get(newCourseSchedule.getType());
+						if (tdms != null) {
+							// 乐团结算方式
+							String settlementType = musicGroupSettlementsMap.get(courseScheduleId);
+							int unitMinutes = 30;
+							if (newCourseSchedule.getType() == CourseScheduleType.CLASSROOM) {
+								unitMinutes = 40;
+							} else if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
+								unitMinutes = 45;
+							}
+
+							// 如果当前教师是在指定日期之后入职的,则按照3.0的方式结算
+							Teacher teacher = teacherMap.get(teacherId);
+							if (Objects.nonNull(teacher.getEntryDate())
+									&& (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
+								settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
+							}
+							if (StringUtils.equals(settlementType, "TEACHER_DEFAULT")) {
+								if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
+									ts.setExpectSalary(new BigDecimal(tdms.getMainTeacher30MinSalary().doubleValue() * newMinutes / unitMinutes));
+								} else {
+									ts.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher30MinSalary().doubleValue() * newMinutes / unitMinutes));
+								}
+							} else if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
+								if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
+									ts.setExpectSalary(new BigDecimal(tdms.getMainTeacher90MinSalary().doubleValue() * newMinutes / unitMinutes));
+								} else {
+									ts.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher90MinSalary().doubleValue() * newMinutes / unitMinutes));
+								}
+							}
+						}
+					} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
+						Map<Integer, TeacherDefaultVipGroupSalary> map = vipGroupSalaryMap.get(teacherId);
+						if (vipGroup == null) {
+							throw new BizException("课程[{}]记录存在异常,请联系管理员", courseScheduleId);
+						}
+						TeacherDefaultVipGroupSalary tdvs = map.get(vipGroup.getVipGroupCategoryId());
+						if (tdvs != null) {
+							if (newCourseSchedule.getTeachMode() == TeachModeEnum.OFFLINE) {
+								ts.setExpectSalary(tdvs.getOfflineClassesSalary());
+							} else {
+								ts.setExpectSalary(tdvs.getOfflineClassesSalary());
+							}
+						}
+					} else if (newCourseSchedule.getGroupType() == GroupType.PRACTICE) {
+						ts.setExpectSalary(new BigDecimal(30));
+					}
+					insertCourseScheduleTeacherSalaryList.add(ts);
+				}
+			}
+
+			// 调整日志
+			CourseScheduleModifyLog courseScheduleModifyLog = new CourseScheduleModifyLog();
+			courseScheduleModifyLog.setCourseScheduleId(courseScheduleId);
+			courseScheduleModifyLog.setCreateTime(date);
+			courseScheduleModifyLog.setCurrentCourseSchedule(JsonUtil.toJSONString(newCourseSchedule));
+			courseScheduleModifyLog.setPreviousCourseSchedule(JsonUtil.toJSONString(oldCourseSchedule));
+
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (null == sysUser) {
+				throw new BizException("获取用户信息失败");
+			}
+
+			courseScheduleModifyLog.setOperatorId(sysUser.getId());
+
+			insertCourseScheduleModifyLogList.add(courseScheduleModifyLog);
+		}
+
+		if (insertTeacherAttendanceList.size() > 0) {
+			teacherAttendanceDao.batchInsert(insertTeacherAttendanceList);
+		}
+
+		if (insertCourseScheduleTeacherSalaryList.size() > 0) {
+			courseScheduleTeacherSalaryDao.batchInsert(insertCourseScheduleTeacherSalaryList);
+		}
+
+		if (insertCourseScheduleModifyLogList.size() > 0) {
+			courseScheduleModifyLogDao.batchInsert(insertCourseScheduleModifyLogList);
+		}
+		
+		if(newCourseSchedules.size() > 0){
+			courseScheduleDao.batchUpdate(newCourseSchedules);
+		}
+
+		// 推送
+		try {
+			Set<Integer> teacherIds = newCourseSchedules.stream().map(e -> e.getActualTeacherId()).collect(Collectors.toSet());
+			if (teacherIds == null) {
+				teacherIds = new HashSet<>();
+			}
+			teacherIds.addAll(oldCourseScheduleList.stream().map(e -> e.getActualTeacherId()).collect(Collectors.toSet()));
+			Map<Integer, String> map = new HashMap<>(teacherIds.size());
+			teacherIds.removeAll(Collections.singleton(null));
+			teacherIds.forEach(e -> {
+				map.put(e, e.toString());
+			});
+			if (map != null && map.size() > 0) {
+				sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT, map, null, 0, "7",
+						"TEACHER");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
     }
 
     @Override
@@ -1760,7 +2107,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 }
 
                 if (teacherIsChange) {
-                    VipGroup byCourseSchedule = vipGroupDao.findByCourseSchedule(newCourseSchedule.getId().intValue());
+                    VipGroup byCourseSchedule = vipGroupDao.findByCourseSchedule(newCourseSchedule.getId());
 
                     BigDecimal onlineTeacherSalary = new BigDecimal(0), offlineTeacherSalary = new BigDecimal(0);
 
@@ -2592,9 +2939,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(Objects.isNull(courseSchedule.getStartClassTime())){
             throw new BizException("请指定上课时间");
         }
-        CourseSchedule oldCourseSchedule = courseScheduleDao.get(courseScheduleId);
+        CourseSchedule oldCourseSchedule = courseScheduleDao.getSurplusCourseWithGroup(courseScheduleId);
         if(Objects.isNull(oldCourseSchedule)){
-            throw new BizException("未找到对应课程");
+            throw new BizException("调整失败: 课程状态异常");
         }
         if(!oldCourseSchedule.getGroupType().equals(GroupType.PRACTICE)){
             throw new BizException("请选择陪练课");
@@ -2668,9 +3015,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(Objects.isNull(teacherId)){
             throw new BizException("请指定上课老师");
         }
-        CourseSchedule oldCourseSchedule = courseScheduleDao.get(courseScheduleId);
+        CourseSchedule oldCourseSchedule = courseScheduleDao.getSurplusCourseWithGroup(courseScheduleId);
         if(Objects.isNull(oldCourseSchedule)){
-            throw new BizException("未找到对应课程");
+            throw new BizException("调整失败: 课程状态异常");
         }
         if(!oldCourseSchedule.getGroupType().equals(GroupType.PRACTICE)){
             throw new BizException("请选择陪练课");

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

@@ -364,7 +364,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
         //获取课程对应教学点补贴
-        List<Map<Integer, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
         Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
 
         //课程编号与课程对应集合

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.service.GroupClassService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @Author Joburgess
@@ -35,14 +36,17 @@ public class GroupClassServiceImpl implements GroupClassService {
     private StudentAttendanceDao studentAttendanceDao;
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean deleteGroupInfo(String groupId, GroupType groupType) {
         groupDao.deleteGroup(groupId,groupType.getCode());
         classGroupDao.deleteByGroup(groupId,groupType);
+        classGroupTeacherMapperDao.deleteByGroup(groupId,groupType);
+        classGroupTeacherSalaryDao.deleteByGroup(groupId,groupType);
         classGroupStudentMapperDao.deleteByGroup(groupId,groupType);
-        courseScheduleDao.deleteCourseSchedulesByMusicGroupID(groupId,groupType);
-        courseScheduleTeacherSalaryDao.deleteByMusicGroupId(groupId,groupType);
-        courseScheduleStudentPaymentDao.deleteByMusicGroupId(groupId,groupType);
-        teacherAttendanceDao.deleteByMusicGroupId(groupId,groupType);
+        courseScheduleDao.deleteByGroup(groupId,groupType);
+        courseScheduleTeacherSalaryDao.deleteByGroup(groupId,groupType);
+        courseScheduleStudentPaymentDao.deleteByGroup(groupId,groupType);
+        teacherAttendanceDao.deleteByGroup(groupId,groupType);
         studentAttendanceDao.deleteByGroup(groupId,groupType);
         return true;
     }

+ 124 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -888,6 +888,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }else{
                 disableApplyWeekDay.add(Calendar.SUNDAY);
             }
+        }else{
+            result.put("teacherFreeDays", new ArrayList<>());
+            return result;
         }
 
         Date now = new Date();
@@ -1683,6 +1686,11 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if (Objects.nonNull(teacherFreeTime.getTotalTimes())) {
                 maxTeacherCourses = teacherFreeTime.getTotalTimes();
             }
+        }else{
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            result.put("status", "TEACHER_PRACTICE_REPEAT");
+            result.put("info", "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
+            return result;
         }
 
         Date monday1 = DateUtil.getWeekDayWithDate(allCourseDates.get(0), Calendar.MONDAY);
@@ -2139,6 +2147,15 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         if (!CollectionUtils.isEmpty(userCourses)) {
             Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseTypeCourseMap = userCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+
+            List<CourseSchedule> practiceCourses = courseTypeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
+            if (!CollectionUtils.isEmpty(practiceCourses)) {
+                for (CourseSchedule practiceCourse : practiceCourses) {
+                    if (!includeTeacherIds.contains(practiceCourse.getTeacherId())) {
+                        includeTeacherIds.add(practiceCourse.getTeacherId());
+                    }
+                }
+            }
             List<CourseSchedule> vipCourses = courseTypeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
             if (!CollectionUtils.isEmpty(vipCourses)) {
                 for (CourseSchedule vipCourse : vipCourses) {
@@ -2193,9 +2210,20 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Override
     public Map<Integer, List<String>> getEnableApplyDatesWithWeek() {
         Map<Integer, List<String>> result = new HashMap<>();
+        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);
+        Integer practiceApplyIntervalMinutes = practiceApplyIntervalTimeConfig.getParanValue(Integer.class);
+        LocalTime dayStartTime=LocalTime.parse(practiceApplyStartTimeConfig.getParanValue(),DateUtil.timeFormatter);
+        LocalTime dayEndTime=LocalTime.parse(practiceApplyEndTimeConfig.getParanValue(),DateUtil.timeFormatter);
+        List<String> dayApplyTimes=new ArrayList<>();
+        while (dayEndTime.isAfter(dayStartTime)){
+            dayApplyTimes.add(dayStartTime.format(DateUtil.timeFormatter));
+            dayStartTime=dayStartTime.plusMinutes(practiceApplyIntervalMinutes);
+        }
         for (int i = 1; i <= 7; i++) {
             List<String> tempTimes = new ArrayList<>();
-            for (String applyDayTime : applyDayTimes) {
+            for (String applyDayTime : dayApplyTimes) {
                 tempTimes.add(applyDayTime);
             }
             result.put(i, tempTimes);
@@ -2220,6 +2248,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             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);
@@ -2242,29 +2271,40 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if (Objects.nonNull(teacherFreeTime.getHoliday())) {
                 holiday = teacherFreeTime.getHoliday();
             }
-            if (Objects.nonNull(teacherFreeTime.getHoliday())) {
-                holiday = DateUtil.normalWeekNumCalendarWeekNumMap.get(teacherFreeTime.getHoliday());
-            }
-            if(Objects.nonNull(teacherFreeTime.getMonday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.MONDAY), JSON.parseArray(teacherFreeTime.getMonday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getMonday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.MONDAY.getValue()), JSON.parseArray(teacherFreeTime.getMonday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.MONDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getTuesday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.TUESDAY), JSON.parseArray(teacherFreeTime.getTuesday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getTuesday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.TUESDAY.getValue()), JSON.parseArray(teacherFreeTime.getTuesday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.TUESDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getWednesday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.WEDNESDAY), JSON.parseArray(teacherFreeTime.getWednesday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getWednesday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.WEDNESDAY.getValue()), JSON.parseArray(teacherFreeTime.getWednesday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.WEDNESDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getThursday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.THURSDAY), JSON.parseArray(teacherFreeTime.getThursday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getThursday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.THURSDAY.getValue()), JSON.parseArray(teacherFreeTime.getThursday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.THURSDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getFriday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.FRIDAY), JSON.parseArray(teacherFreeTime.getFriday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getFriday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.FRIDAY.getValue()), JSON.parseArray(teacherFreeTime.getFriday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.FRIDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getSaturday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.SATURDAY), JSON.parseArray(teacherFreeTime.getSaturday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getSaturday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.SATURDAY.getValue()), JSON.parseArray(teacherFreeTime.getSaturday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.SATURDAY.getValue());
             }
-            if(Objects.nonNull(teacherFreeTime.getSunday())){
-                teacherFreeTimes.put(String.valueOf(Calendar.SUNDAY), JSON.parseArray(teacherFreeTime.getSunday()));
+            if(StringUtils.isNotBlank(teacherFreeTime.getSunday())){
+                teacherFreeTimes.put(String.valueOf(DayOfWeek.SUNDAY.getValue()), JSON.parseArray(teacherFreeTime.getSunday()));
+            }else{
+                disableApplyWeekDay.add(DayOfWeek.SUNDAY.getValue());
             }
         }
 
@@ -2346,7 +2386,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
         }
 
-        for (Integer weekNum : weekNumApplyTimesMap.keySet()) {
+        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);
@@ -2359,8 +2401,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                         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(enableApplyStartTime.isBefore(teacherFreeEndTime)
-                                &&enableApplyEndTime.isAfter(teacherFreeStartTime)){
+                        if(enableApplyEndTime.compareTo(teacherFreeEndTime)<=0
+                                &&enableApplyStartTime.compareTo(teacherFreeStartTime)>=0){
                             isInclude=true;
                             break;
                         }
@@ -2371,11 +2413,14 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 }
                 weekNumApplyTimesMap.put(weekNum,applyTimeStrs);
             }else{
-                weekNumApplyTimesMap.remove(weekNum);
+                weekNumApplyTimeIterator.remove();
             }
         }
 
         if (CollectionUtils.isEmpty(allTeacherCourses)) {
+            if(weekNumApplyTimesMap.size()<=1){
+                weekNumApplyTimesMap=new HashMap<>();
+            }
             result.put("teacherFreeDays", weekNumApplyTimesMap);
             return result;
         }
@@ -2429,6 +2474,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             weekNumApplyTimesMap.put(courseStartTime.getDayOfWeek().getValue(), applyTimeStrs);
         }
+        if(weekNumApplyTimesMap.size()<=1){
+            weekNumApplyTimesMap=new HashMap<>();
+        }
         result.put("teacherFreeDays", weekNumApplyTimesMap);
         return result;
     }
@@ -2487,7 +2535,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceGroupBuyParams.setCoursesStartDate(courseStartDate);
         LocalDate currentExpiredDay = courseStartDay.plusMonths(practiceGroupBuyParams.getBuyMonths());
         Date courseExpiredDate=Date.from(currentExpiredDay.atStartOfDay(DateUtil.zoneId).toInstant());
-        practiceGroupBuyParams.setCoursesStartDate(courseExpiredDate);
+        practiceGroupBuyParams.setCoursesExpireDate(courseExpiredDate);
 
         LocalDate courseStartMonday=courseStartDay.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
         LocalDate courseExpiredSunday=currentExpiredDay.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
@@ -2502,7 +2550,10 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if (Objects.nonNull(teacherFreeTime.getTotalTimes())) {
                 maxTeacherCourses = teacherFreeTime.getTotalTimes();
             }
+        }else{
+            return BaseController.failed(HttpStatus.MULTIPLE_CHOICES,"抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
         }
+
         int courseWeekNum = 0;
         int practiceCourseNum = 0;
         LocalDateTime tempClassDateTime;
@@ -2531,19 +2582,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         List<CourseSchedule> practiceCourses = createPracticeCourses(practiceGroupBuyParams, practiceCourseMinutes);
 
-        try {
-            courseScheduleService.checkNewCourseSchedules(practiceCourses,false);
-        } catch (Exception e) {
-            return BaseController.failed(HttpStatus.FOUND, "课程冲突");
-        }
-
         JSONObject drillTimesObject=new JSONObject();
         for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
             drillTimesObject.put(String.valueOf(drillTime.getWeekNum()),drillTime.getTimeStr());
         }
 
         PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(sysUser.getOrganId());
-        BigDecimal oneMonthPrice=new BigDecimal(0);
+        BigDecimal oneMonthPrice;
         if(practiceBuyActivityExpireDate.after(now)){
             oneMonthPrice=practiceGroupBuyParams.getDrillTimesOnWeek()==1?practiceGroupSellPrice.getOnceActivityPrice():practiceGroupSellPrice.getTwiceActivityPrice();
         }else{
@@ -2661,13 +2706,20 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
         teacherAttendanceDao.batchInsert(teacherAttendances);
 
+        try {
+            courseScheduleService.checkNewCourseSchedules(practiceCourses,false);
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return BaseController.failed(HttpStatus.FOUND, "课程冲突");
+        }
+
         StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
         String orderNo=idGeneratorService.generatorId("payment") + "";
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
-        studentPaymentOrder.setType(OrderTypeEnum.SMALL_CLASS_TO_BUY);
+        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
         studentPaymentOrder.setExpectAmount(amount);
         studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
         studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
@@ -2691,6 +2743,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
                 sysUserCashAccountService.updateBalance(practiceGroupBuyParams.getStudentId(), studentPaymentOrder.getExpectAmount().negate(),PlatformCashAccountDetailTypeEnum.PAY_FEE,"陪练课购买");
 
+                this.orderCallback(studentPaymentOrder);
+
                 Map<String,Object> result=new HashMap<>();
                 result.put("orderNo",studentPaymentOrder.getOrderNo());
 
@@ -2766,6 +2820,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     courseSchedules.add(courseSchedule);
                 }
             }
+            courseStartDay=courseStartDay.plusDays(1);
         }
         return courseSchedules;
     }
@@ -2839,4 +2894,42 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
         return userPracticeGroups;
     }
+
+    @Override
+    public PracticeBuyResultDto queryOrderInfo(String orderNo) {
+        if(StringUtils.isBlank(orderNo)){
+            throw new BizException("订单不存在");
+        }
+        StudentPaymentOrder order = studentPaymentOrderDao.findOrderByOrderNo(orderNo);
+        if(Objects.isNull(order)){
+            throw new BizException("订单不存在");
+        }
+        PracticeBuyResultDto practiceBuyResult=new PracticeBuyResultDto();
+        practiceBuyResult.setOrderNo(orderNo);
+        practiceBuyResult.setStatus(order.getStatus());
+        practiceBuyResult.setCreateTime(order.getCreateTime());
+        if(order.getStatus().equals(DealStatusEnum.FAILED)){
+            return practiceBuyResult;
+        }
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(order.getMusicGroupId()));
+        JSONArray coursesArry=new JSONArray();
+        JSONObject courseJson=JSON.parseObject(practiceGroup.getDrillTimesJson());
+        for (String weekNumStr : courseJson.keySet()) {
+            JSONObject newCourseJson=new JSONObject();
+            newCourseJson.put("weekName",DateUtil.weekNumNormalWeekNameMap.get(Integer.parseInt(weekNumStr)));
+            LocalTime courseStartTime=LocalTime.parse(courseJson.getString(weekNumStr),DateUtil.timeFormatter);
+            LocalTime courseEndTime=courseStartTime.plusMinutes(practiceCourseMinutes);
+            newCourseJson.put("startTime",courseStartTime.format(DateUtil.timeFormatter));
+            newCourseJson.put("endTime",courseEndTime.format(DateUtil.timeFormatter));
+            coursesArry.add(newCourseJson);
+        }
+        practiceBuyResult.setDrillTimesJson(coursesArry.toJSONString());
+        practiceBuyResult.setCourseStartTime(practiceGroup.getCoursesStartDate());
+        practiceBuyResult.setCourseEndTime(practiceGroup.getCoursesExpireDate());
+        Teacher teacher = teacherDao.get(practiceGroup.getUserId());
+        practiceBuyResult.setTeacherName(teacher.getRealName());
+        return practiceBuyResult;
+    }
 }

+ 12 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1,18 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.alibaba.fastjson.JSON;
 import com.huifu.adapay.model.payment.Payment;
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
@@ -25,11 +12,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.SporadicChargeInfoService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -39,6 +22,11 @@ import com.ym.mec.thirdparty.yqpay.RsqMsg;
 import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, StudentPaymentOrder> implements StudentPaymentOrderService {
@@ -55,6 +43,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private MusicGroupService musicGroupService;
     @Autowired
     private SporadicChargeInfoService sporadicChargeInfoService;
+    @Autowired
+    private PracticeGroupService practiceGroupService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -203,6 +193,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             musicGroupService.renewForCallback(order);
         }else if (order.getType().equals(OrderTypeEnum.SPORADIC)||order.getType().equals(OrderTypeEnum.LUCK)){
             sporadicChargeInfoService.renewForCallback(order);
+        }else if (order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_BUY)){
+            practiceGroupService.orderCallback(order);
         }
     }
 
@@ -234,6 +226,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     musicGroupService.renewForCallback(order);
                 }else if (order.getType().equals(OrderTypeEnum.SPORADIC)||order.getType().equals(OrderTypeEnum.LUCK)){
                     sporadicChargeInfoService.renewForCallback(order);
+                }else if (order.getType().equals(OrderTypeEnum.PRACTICE_GROUP_BUY)){
+                    practiceGroupService.orderCallback(order);
                 }
             } catch (Exception e) {
                 e.printStackTrace();

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

@@ -79,9 +79,9 @@
         </trim>
     </insert>
 
-    <update id="deleteByGroup">
-        UPDATE class_group SET del_flag_ = 1,update_time_=NOW() WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-    </update>
+    <delete id="deleteByGroup">
+        DELETE FROM class_group WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+    </delete>
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="ClassGroup">

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -64,7 +64,7 @@
         UPDATE class_group_student_mapper SET status_='QUIT' WHERE class_group_id_ = #{classGroupId} AND status_='NORMAL'
     </delete>
     <delete id="deleteByGroup">
-        UPDATE class_group_student_mapper SET status_='QUIT' WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        DELETE FROM class_group_student_mapper WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </delete>
 
     <!-- 分页查询 -->

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

@@ -185,4 +185,7 @@
             #{classGroupId}
         </foreach>
     </delete>
+    <delete id="deleteByGroup">
+        DELETE FROM class_group_teacher_mapper WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+    </delete>
 </mapper>

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherSalaryMapper.xml

@@ -20,7 +20,10 @@
     delete from class_group_teacher_salary
     where id_ = #{id}
   </delete>
-  <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary" useGeneratedKeys="true">
+    <delete id="deleteByGroup">
+      DELETE FROM class_group_teacher_salary WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+    </delete>
+    <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary" useGeneratedKeys="true">
     insert into class_group_teacher_salary
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="groupType != null">

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

@@ -151,7 +151,7 @@
         (group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,schoole_id_,is_lock_)
         VALUE
         <foreach collection="list" item="course" separator=",">
-            (#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},#{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},#{course.teacherId},now(),now(),#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.name},#{course.teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.studentNum},#{course.leaveStudentNum},#{course.schoolId},#{isLock})
+            (#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},#{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},#{course.teacherId},now(),now(),#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.name},#{course.teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.studentNum},#{course.leaveStudentNum},#{course.schoolId},#{course.isLock})
         </foreach>
     </insert>
 
@@ -1723,7 +1723,10 @@
             #{courseScheduleId}
         </foreach>
     </delete>
-    
+    <delete id="deleteByGroup">
+        DELETE FROM course_schedule WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+    </delete>
+
     <select id="queryUnsignedStudentList" resultMap="StudentAttendance">
         SELECT cssp.user_id_,cs.actual_teacher_id_ teacher_id_,
         cs.id_ course_schedule_id_,cs.class_group_id_,cs.music_group_id_,cs.group_type_,cg.current_class_times_
@@ -1947,6 +1950,34 @@
             AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > NOW()
             AND cs.music_group_id_ = #{groupId}
     </select>
+
+    <select id="getSurplusCourseWithGroup" resultMap="CourseSchedule">
+        SELECT
+            cs.id_,
+            cs.music_group_id_,
+            cs.group_type_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.subsidy_,
+            cs.class_date_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.teacher_id_,
+            cs.actual_teacher_id_,
+            cs.create_time_,
+            cs.update_time_,
+            cs.teach_mode_,
+            cs.type_,
+            cs.name_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.schoole_id_
+        FROM course_schedule cs
+        WHERE
+            (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
+            AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > NOW()
+            AND cs.id_ = #{courseScheduleId}
+    </select>
     <select id="countClassGroupOverCourseNum" resultType="int">
         SELECT COUNT(*) FROM course_schedule WHERE class_group_id_=#{classGroupId} AND CONCAT(class_date_,' ',end_class_time_)&lt;NOW()
     </select>
@@ -2306,6 +2337,29 @@
             </foreach>
             AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
     </select>
+    <select id="findUserCoursesWithPay" resultMap="CourseSchedule">
+        SELECT
+        cs.id_,
+        cs.`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.`type_` IN ( 'NORMAL', 'HIGH', 'VIP', 'PRACTICE')
+        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="queryTeacherName" resultType="java.util.Map">
         SELECT cs.id_ 'key',su.real_name_ 'value' FROM course_schedule cs

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

@@ -315,4 +315,7 @@
 	<delete id="deleteByMusicGroupId" parameterType="map">
 		DELETE cssp FROM course_schedule_student_payment cssp left join course_schedule cs on cssp.course_schedule_id_ = cs.id_ WHERE cssp.music_group_id_=#{musicGroupId} AND cssp.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
 	</delete>
+	<delete id="deleteByGroup">
+		DELETE FROM course_schedule_student_payment WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+	</delete>
 </mapper>

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -430,8 +430,11 @@
     <delete id="deleteByMusicGroupId" parameterType="map" >
 		DELETE cssp FROM course_schedule_teacher_salary cssp left join course_schedule cs on cssp.course_schedule_id_ = cs.id_ WHERE cssp.music_group_id_=#{musicGroupId} AND cssp.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
 	</delete>
+	<delete id="deleteByGroup">
+		DELETE FROM course_schedule_teacher_salary WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+	</delete>
 
-    <select id="queryUserNoSettlementListByTypeAndStartClassDate" resultMap="CourseScheduleTeacherSalary">
+	<select id="queryUserNoSettlementListByTypeAndStartClassDate" resultMap="CourseScheduleTeacherSalary">
 		SELECT ts.*,cs.type_,cs.teach_mode_,cs.class_date_,cs.start_class_time_,cs.end_class_time_ FROM course_schedule_teacher_salary ts LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
 		WHERE FIND_IN_SET(cs.type_, #{typeList}) AND ts.user_id_ = #{userId} AND ts.settlement_time_ IS NULL AND cs.class_date_ &gt;= #{startClassDate}
 	</select>

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

@@ -44,13 +44,13 @@
 
     <delete id="deleteGroup">
         DELETE FROM
-        <if test="groupType!=null and groupType='MUSIC'">
+        <if test="groupType!=null and groupType=='MUSIC'.toString()">
             music_group
         </if>
-        <if test="groupType!=null and groupType='VIP'">
+        <if test="groupType!=null and groupType=='VIP'.toString()">
             vip_group
         </if>
-        <if test="groupType!=null and groupType='PRACTICE'">
+        <if test="groupType!=null and groupType=='PRACTICE'.toString()">
             practice_group
         </if>
         WHERE id_=#{groupId}

+ 1 - 2
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -170,8 +170,7 @@
         </foreach>
     </delete>
     <delete id="deleteByGroup">
-        DELETE sa FROM student_attendance sa LEFT JOIN course_schedule cs ON sa.course_schedule_id_ = cs.id_
-		WHERE sa.music_group_id_=#{musicGroupId} AND sa.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
+        DELETE FROM student_attendance WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </delete>
 
     <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml

@@ -11,6 +11,7 @@
         <result column="name_" property="name"/>
         <result column="code_" property="code"/>
         <result column="parent_subject_id_" property="parentSubjectId"/>
+        <result column="img_" property="img"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="del_flag_" property="delFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -29,8 +30,8 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Subject" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
-        INSERT INTO subject (id_,name_,code_,parent_subject_id_,create_time_,update_time_)
-        VALUES(#{id},#{name},#{code},#{parentSubjectId},now(),now())
+        INSERT INTO subject (id_,name_,code_,parent_subject_id_,img_,create_time_,update_time_)
+        VALUES(#{id},#{name},#{code},#{parentSubjectId},#{img},now(),now())
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -46,6 +47,9 @@
             <if test="code != null">
                 code_ = #{code},
             </if>
+            <if test="img != null">
+                img_ = #{img},
+            </if>
             <if test="updateTime != null">
                 update_time_ = NOW(),
             </if>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -381,4 +381,11 @@
 		DELETE ta FROM teacher_attendance ta LEFT JOIN course_schedule cs ON ta.course_schedule_id_ = cs.id_
 		WHERE ta.music_group_id_=#{musicGroupId} AND ta.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
 	</delete>
+	
+    <delete id="deletebyCourseScheduleId">
+        DELETE from teacher_attendance WHERE course_schedule_id_=#{courseScheduleId}
+    </delete>
+    <delete id="deleteByGroup">
+        DELETE FROM teacher_attendance WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+    </delete>
 </mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/TeacherDefaultVipGroupSalaryMapper.xml

@@ -103,4 +103,12 @@
     <select id="queryByUserId" resultMap="TeacherDefaultVipGroupSalary">
 		SELECT * FROM teacher_default_vip_group_salary where user_id_ = #{userId} ORDER BY id_
 	</select>
+	
+    <select id="queryByUserIdList" resultMap="TeacherDefaultVipGroupSalary">
+		SELECT * FROM teacher_default_vip_group_salary where user_id_ IN
+		<foreach collection="userIdList" item="userId" open="(" close=")" separator=",">
+			#{userId}
+		</foreach>
+		 ORDER BY id_
+	</select>
 </mapper>

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

@@ -139,7 +139,7 @@ public class PracticeGroupController extends BaseController {
     }
 
     @ApiOperation("陪练课购买")
-    @GetMapping(value = "/buyPracticeGroup")
+    @PostMapping(value = "/buyPracticeGroup")
     public HttpResponseResult buyPracticeGroup(@RequestBody PracticeGroupBuyDto practiceGroupBuyParams){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
@@ -159,4 +159,10 @@ public class PracticeGroupController extends BaseController {
         return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(sysUser.getId()));
     }
 
+    @ApiOperation("查询订单信息")
+    @GetMapping(value = "/queryOrderInfo")
+    public HttpResponseResult queryOrderInfo(String orderNo){
+        return succeed(practiceGroupService.queryOrderInfo(orderNo));
+    }
+
 }

+ 74 - 9
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -1,11 +1,35 @@
 package com.ym.mec.teacher.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
 import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
@@ -14,16 +38,11 @@ import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.*;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 
 /**
  * @Author Joburgess
@@ -42,6 +61,14 @@ public class TeacherCourseScheduleController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private SysConfigService sysConfigService;
+    
+    @Autowired
+    private VipGroupService vipGroupService;
+    
+    @Autowired
+    private StudentAttendanceDao studentAttendanceDao;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
     @ApiOperation(value = "根据月份获取该月有课的日期")
     @GetMapping("/getCourseScheduleDateByMonth")
@@ -151,6 +178,44 @@ public class TeacherCourseScheduleController extends BaseController {
         if(Objects.isNull(oldCourseSchedule)){
             return failed("未找到指定课程");
         }
+        if(oldCourseSchedule.getGroupType() != GroupType.VIP){
+        	return failed("客户端只能调整VIP课");
+        }
+        Date now = new Date();
+        
+        //默认开课前4小时内,可调整,如果全员请假,可在当天24小时前调整
+        SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS);
+        Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+        
+        List<Long> newCourseScheduleIds = new ArrayList<Long>();
+        newCourseScheduleIds.add(oldCourseSchedule.getId());
+        List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(newCourseScheduleIds, advanceLeaveHours);
+        Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
+
+        List<Integer> classGroupIds = new ArrayList<Integer>();
+        classGroupIds.add(oldCourseSchedule.getClassGroupId());
+        List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds, ClassGroupStudentStatusEnum.NORMAL);
+        Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
+
+        Long normalStudentNum = classGroupStudentNumMap.get(oldCourseSchedule.getClassGroupId());
+        Long courseLeaveStudentNum = courseLeaveStudentNumMap.get(oldCourseSchedule.getId());
+        if(oldCourseSchedule.getGroupType().equals(GroupType.VIP)
+                &&Objects.nonNull(courseLeaveStudentNum)
+                &&Objects.nonNull(normalStudentNum)
+                &&courseLeaveStudentNum.intValue()==normalStudentNum.intValue()){
+            if(!DateUtil.isSameDay(now,oldCourseSchedule.getStartClassTime())&&now.after(oldCourseSchedule.getStartClassTime())){
+                throw new BizException("当前时间不可对相关课程进行调整");
+            }
+        }else{
+            if(DateUtil.addHours(now,advanceLeaveHours).after(oldCourseSchedule.getStartClassTime())){
+                throw new BizException("请在课程开始前{}小时进行调整",advanceLeaveHours);
+            }
+        }
+        
+        if (oldCourseSchedule.getGroupType().equals(GroupType.VIP)) {
+            vipGroupService.checkVipCourseIsInScore(Long.valueOf(oldCourseSchedule.getMusicGroupId()));
+        }
+        
         if(Objects.isNull(classDateAdjustDto.getClassGroupId())){
             classDateAdjustDto.setClassGroupId(oldCourseSchedule.getClassGroupId());
         }

+ 47 - 0
mec-util/src/main/java/com/ym/mec/util/collection/ListUtil.java

@@ -0,0 +1,47 @@
+package com.ym.mec.util.collection;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+public class ListUtil {
+
+	/**
+	 * 两个集合是否相等,与元素顺序无关
+	 * @param list1
+	 * @param list2
+	 * @return
+	 */
+	public static boolean isEquals(List<?> list1, List<?> list2) {
+		if (null != list1 && null != list2) {
+			if(list1.size() != list2.size()){
+				return false;
+			}
+			ListIterator<?> listIterator = list1.listIterator();
+			while(listIterator.hasNext()){
+				Object obj = listIterator.next();
+				if(!list2.contains(obj)){
+					return false;
+				}
+				listIterator.remove();
+				list2.remove(obj);
+			}
+		}
+		return true;
+	}
+	
+	
+	public static void main(String[] args) {
+		List<Integer> list1 = new ArrayList<Integer>();
+		list1.add(2);
+		list1.add(2);
+		list1.add(1);
+		
+		List<Integer> list2 = new ArrayList<Integer>();
+		list2.add(2);
+		list2.add(2);
+		list2.add(2);
+		
+		System.out.println(isEquals(list1,list2)? "true" : "false");
+	}
+}

+ 3 - 2
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -25,8 +25,9 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0").antMatchers("/v2/api-docs","/classGroup/highClassGroups","/code/*","/api/*").permitAll().anyRequest().authenticated()
-				.and().httpBasic();
+				.authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
+				.antMatchers("/v2/api-docs", "/classGroup/highClassGroups", "/code/*", "/api/*", "/appVersionInfo/queryByPlatform").permitAll().anyRequest()
+				.authenticated().and().httpBasic();
 	}
 
 	@Override