Browse Source

系统收费

zouxuan 3 years ago
parent
commit
b38cb60228
33 changed files with 1306 additions and 18 deletions
  1. 3 3
      codegen/src/main/resources/generateConfigration.xml
  2. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  5. 19 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermCourseDetailDao.java
  6. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermStudentCourseDetailDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  8. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroupTeachersDto.java
  10. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  11. 116 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSchoolTermCourseDetail.java
  12. 158 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSchoolTermStudentCourseDetail.java
  13. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  14. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  15. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSchoolTermCourseDetailService.java
  16. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSchoolTermStudentCourseDetailService.java
  17. 308 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  18. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  19. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankOrganizationFeeMapperServiceImpl.java
  20. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  21. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  22. 132 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  23. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermStudentCourseDetailServiceImpl.java
  24. 15 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  25. 5 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  26. 5 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  27. 3 2
      mec-biz/src/main/resources/config/mybatis/MemberRankOrganizationFeeMapperMapper.xml
  28. 85 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermCourseDetailMapper.xml
  29. 136 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermStudentCourseDetailMapper.xml
  30. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  31. 15 2
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  32. 22 0
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  33. 26 0
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupSchoolTermCourseDetailController.java

+ 3 - 3
codegen/src/main/resources/generateConfigration.xml

@@ -2,11 +2,11 @@
 <GenerateConfiguration>
 	<dbConfiguration>
 		<driverClass>com.mysql.jdbc.Driver</driverClass>
-		<url>jdbc:mysql://47.114.1.200:3306/mec_test</url>
+		<url>jdbc:mysql://47.114.1.200:3306/mec_dev</url>
 		<username>mec_dev</username>
 		<password>dayaDataOnline@2019</password>
-		<catalog>mec_test</catalog>
-		<schema>mec_test</schema>
+		<catalog>mec_dev</catalog>
+		<schema>mec_dev</schema>
 	</dbConfiguration>
 	<srcBase>/Users/chenxiaoyu/Documents/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>

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

@@ -1110,6 +1110,14 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<Integer, Long>> countTotalNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("classDate") Date classDate);
 
     /**
+     * 根据班级编号count总课时
+     *
+     * @param classGroupIds
+     * @return
+     */
+    List<Map<Integer, Long>> countPreTotalNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds);
+
+    /**
      * 根据班级编号count当前课时(已上总数)
      *
      * @param classGroupIds
@@ -1841,4 +1849,17 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
     List<CourseSchedule> getBeMergeCourseWithMainCourseIds(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * 删除乐团预排课课程
+     * @param musicGroupId
+     */
+    void deletePreCourse(String musicGroupId);
+
+    /**
+     * 获取预排课程列表
+     * @param classGroupId
+     * @return
+     */
+    List<CourseSchedule> queryPreCourseList(Integer classGroupId);
 }

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

@@ -526,4 +526,10 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     String getStudentEduTeacher(@Param("studentId") Integer studentId);
+
+    /**
+     * 删除关联的预排课课程
+     * @param musicGroupId
+     */
+    void deletePreCourse(String musicGroupId);
 }

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

@@ -566,4 +566,5 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 */
 	List<Integer> getTodayHasCourseTeacherIds();
 
+    void deletePreCourse(String musicGroupId);
 }

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermCourseDetailDao.java

@@ -0,0 +1,19 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+
+public interface MusicGroupSchoolTermCourseDetailDao extends BaseDAO<Integer, MusicGroupSchoolTermCourseDetail> {
+
+
+    /**
+     * 获取所选时间乐团的预排课明细
+     * @param musicGroupId
+     * @param startCourseDate
+     * @return
+     */
+    MusicGroupSchoolTermCourseDetail findByCourseDateAndMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("startCourseDate") Date startCourseDate);
+}

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermStudentCourseDetailDao.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MusicGroupSchoolTermStudentCourseDetailDao extends BaseDAO<Long, MusicGroupSchoolTermStudentCourseDetail> {
+
+
+    /**
+     * 初始化会员团学员排课详情
+     * @param studentCourseDetail
+     * @param studentIds
+     */
+    void init(@Param("studentCourseDetail") MusicGroupSchoolTermStudentCourseDetail studentCourseDetail, @Param("studentIds") List<Integer> studentIds);
+
+    void deleteByDetailId(Integer courseDetailId);
+
+    /**
+     * 获取所选学员最小可排课时长
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param studentIds
+     * @return
+     */
+    int getMixCourseMinutes(@Param("courseDetailId") Integer musicGroupSchoolTermCourseDetailId, @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 获取所选学员最大的已消耗的单技课时长
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param studentIds
+     * @return
+     */
+    int getMaxSingleCourseMinutes(@Param("courseDetailId") Integer musicGroupSchoolTermCourseDetailId, @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 获取所选学员最大的已消耗的合奏课时长
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param studentIds
+     * @return
+     */
+    int getMaxMixCourseMinutes(@Param("courseDetailId") Integer musicGroupSchoolTermCourseDetailId, @Param("studentIds") List<Integer> studentIds);
+}

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

@@ -285,6 +285,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<Map<String, Integer>> countNormalNum(String musicGroupIds);
 
     /**
+     * 获取乐团在读人数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<Integer> queryNormalUser(String musicGroupId);
+
+    /**
      * 获取学员基本信息
      *
      * @param mobile

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java

@@ -40,6 +40,9 @@ public class ClassGroup4MixDto implements Cloneable{
     @ApiModelProperty(value = "排课次数", required = true)
     private Integer courseTimes;
 
+    @ApiModelProperty(value = "排课时长", required = true)
+    private Integer courseMinutes;
+
     @ApiModelProperty(value = "课程类型", required = true)
     private CourseSchedule.CourseScheduleType courseType;
 
@@ -73,6 +76,25 @@ public class ClassGroup4MixDto implements Cloneable{
     @ApiModelProperty(value = "确认生成课程")
     private Boolean confirmGenerate;
 
+    @ApiModelProperty(value = "预排课学期编号")
+    private Integer musicGroupSchoolTermCourseDetailId;
+
+    public Integer getMusicGroupSchoolTermCourseDetailId() {
+        return musicGroupSchoolTermCourseDetailId;
+    }
+
+    public void setMusicGroupSchoolTermCourseDetailId(Integer musicGroupSchoolTermCourseDetailId) {
+        this.musicGroupSchoolTermCourseDetailId = musicGroupSchoolTermCourseDetailId;
+    }
+
+    public Integer getCourseMinutes() {
+        return courseMinutes;
+    }
+
+    public void setCourseMinutes(Integer courseMinutes) {
+        this.courseMinutes = courseMinutes;
+    }
+
     public Boolean getConfirmGenerate() {
         return confirmGenerate;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroupTeachersDto.java

@@ -21,6 +21,16 @@ public class ClassGroupTeachersDto extends ClassGroup {
 
 	private String bishopTeacherName;
 
+	private Integer preTotalClassTimes;
+
+	public Integer getPreTotalClassTimes() {
+		return preTotalClassTimes;
+	}
+
+	public void setPreTotalClassTimes(Integer preTotalClassTimes) {
+		this.preTotalClassTimes = preTotalClassTimes;
+	}
+
 	public String getTeachingTeacherName() {
 		return teachingTeacherName;
 	}

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

@@ -177,7 +177,18 @@ public class CourseSchedule {
 	private int isSignOut = 3;
 
 	//是否是会员收费的排课
-	private Integer memberFlag;
+	private Integer memberFlag = 0;
+
+	//是否是预排课
+	private Integer preCourseFlag = 0;
+
+	public Integer getPreCourseFlag() {
+		return preCourseFlag;
+	}
+
+	public void setPreCourseFlag(Integer preCourseFlag) {
+		this.preCourseFlag = preCourseFlag;
+	}
 
 	public Integer getMemberFlag() {
 		return memberFlag;

+ 116 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSchoolTermCourseDetail.java

@@ -0,0 +1,116 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+/**
+ * 对应数据库表(music_group_school_term_course_detail):
+ */
+public class MusicGroupSchoolTermCourseDetail {
+
+	/**  */
+	private Integer id;
+	
+	/**  */
+	private String musicGroupId;
+	
+	/** 开课日期 */
+	private java.util.Date startCourseDate;
+	
+	/** 学期开始时间 */
+	private java.util.Date startSchoolTerm;
+	
+	/** 学期截止时间 */
+	private java.util.Date endSchoolTerm;
+	
+	/** 是否排课 */
+	private boolean courseFlag;
+	
+	/** 可排课时长 */
+	private Integer totalCourseTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setMusicGroupId(String musicGroupId){
+		this.musicGroupId = musicGroupId;
+	}
+	
+	public String getMusicGroupId(){
+		return this.musicGroupId;
+	}
+
+	public Date getStartCourseDate() {
+		return startCourseDate;
+	}
+
+	public void setStartCourseDate(Date startCourseDate) {
+		this.startCourseDate = startCourseDate;
+	}
+
+	public Date getStartSchoolTerm() {
+		return startSchoolTerm;
+	}
+
+	public void setStartSchoolTerm(Date startSchoolTerm) {
+		this.startSchoolTerm = startSchoolTerm;
+	}
+
+	public Date getEndSchoolTerm() {
+		return endSchoolTerm;
+	}
+
+	public void setEndSchoolTerm(Date endSchoolTerm) {
+		this.endSchoolTerm = endSchoolTerm;
+	}
+
+	public void setCourseFlag(boolean courseFlag){
+		this.courseFlag = courseFlag;
+	}
+	
+	public boolean isCourseFlag(){
+		return this.courseFlag;
+	}
+			
+	public void setTotalCourseTime(Integer totalCourseTime){
+		this.totalCourseTime = totalCourseTime;
+	}
+	
+	public Integer getTotalCourseTime(){
+		return this.totalCourseTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 158 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSchoolTermStudentCourseDetail.java

@@ -0,0 +1,158 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(music_group_school_term_student_course_detail):
+ */
+public class MusicGroupSchoolTermStudentCourseDetail {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Integer musicGroupSchoolTermCourseDetailId;
+	
+	/**  */
+	private Integer userId;
+	
+	/** 会员可排课时长 */
+	private Integer memberCourseMinutes = 0;
+	
+	/** 预排课消耗时长 */
+	private Integer preMemberCourseMinutes = 0;
+	
+	/** 预排课课程类型消耗的时长明细 */
+	private String preCourseDetail;
+	
+	/**  合奏课消耗的时长*/
+	private Integer mixCourseMinutes = 0;
+	
+	/** 单技课消耗的时长 */
+	private Integer singleCourseMinutes = 0;
+
+	/**  */
+	private Integer totalCourseMinutes = 0;
+
+	/**  */
+	private Integer usedCourseMinutes = 0;
+	
+	/** 用来标注当前缴费项目排了哪些课程类型,以及次数 */
+	private String courseDetail;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	public Integer getMixCourseMinutes() {
+		return mixCourseMinutes;
+	}
+
+	public void setMixCourseMinutes(Integer mixCourseMinutes) {
+		this.mixCourseMinutes = mixCourseMinutes;
+	}
+
+	public Integer getSingleCourseMinutes() {
+		return singleCourseMinutes;
+	}
+
+	public void setSingleCourseMinutes(Integer singleCourseMinutes) {
+		this.singleCourseMinutes = singleCourseMinutes;
+	}
+
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setMusicGroupSchoolTermCourseDetailId(Integer musicGroupSchoolTermCourseDetailId){
+		this.musicGroupSchoolTermCourseDetailId = musicGroupSchoolTermCourseDetailId;
+	}
+	
+	public Integer getMusicGroupSchoolTermCourseDetailId(){
+		return this.musicGroupSchoolTermCourseDetailId;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setMemberCourseMinutes(Integer memberCourseMinutes){
+		this.memberCourseMinutes = memberCourseMinutes;
+	}
+	
+	public Integer getMemberCourseMinutes(){
+		return this.memberCourseMinutes;
+	}
+			
+	public void setPreMemberCourseMinutes(Integer preMemberCourseMinutes){
+		this.preMemberCourseMinutes = preMemberCourseMinutes;
+	}
+	
+	public Integer getPreMemberCourseMinutes(){
+		return this.preMemberCourseMinutes;
+	}
+			
+	public void setPreCourseDetail(String preCourseDetail){
+		this.preCourseDetail = preCourseDetail;
+	}
+	
+	public String getPreCourseDetail(){
+		return this.preCourseDetail;
+	}
+			
+	public void setTotalCourseMinutes(Integer totalCourseMinutes){
+		this.totalCourseMinutes = totalCourseMinutes;
+	}
+	
+	public Integer getTotalCourseMinutes(){
+		return this.totalCourseMinutes;
+	}
+			
+	public void setUsedCourseMinutes(Integer usedCourseMinutes){
+		this.usedCourseMinutes = usedCourseMinutes;
+	}
+	
+	public Integer getUsedCourseMinutes(){
+		return this.usedCourseMinutes;
+	}
+			
+	public void setCourseDetail(String courseDetail){
+		this.courseDetail = courseDetail;
+	}
+	
+	public String getCourseDetail(){
+		return this.courseDetail;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -299,6 +299,13 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     HttpResponseResult classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
 
     /**
+     * 班级预排课
+     * @param classGroup4MixDtos
+     * @return
+     */
+    HttpResponseResult preCourseSchedule(List<ClassGroup4MixDto> classGroup4MixDtos);
+
+    /**
      * 班级调整(增加临时班级)
      * @param classGroup4MixDtos
      * @return
@@ -557,4 +564,18 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param classGroupStudents
      */
     void spanGroupClassAdjustPass(Integer masterClassGroupId,List<Integer> studentIds,List<Long> courseIds,List<Map> classGroupStudents,List<Long> allLockCourseIds,String batchNo,BigDecimal masterTotalPrice);
+
+    /**
+     * 获取班级的预排课课程列表
+     * @param classGroupId
+     * @return
+     */
+    List<CourseSchedule> queryPreCourseList(Integer classGroupId);
+
+    /**
+     * 确认预排课
+     * @param musicGroupSchoolTermCourseDetailId
+     * @return
+     */
+    HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -69,6 +69,17 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds);
 
 	/**
+	 * @describe 创建课程缴费记录-会员乐团
+	 * @author Joburgess
+	 * @date 2020.10.27
+	 * @param musicGroupId: 乐团编号
+	 * @param courseSchedules: 课程计划列表
+	 * @param studentIds: 课程学员列表
+	 * @return void
+	 */
+	void createForMemberMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds);
+
+	/**
 	 * @describe 创建课程缴费记录-乐团-用于合班拆班自动排课
 	 * @author zouxuan
 	 * @date 2020.10.27

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSchoolTermCourseDetailService.java

@@ -0,0 +1,12 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
+import com.ym.mec.common.service.BaseService;
+
+public interface MusicGroupSchoolTermCourseDetailService extends BaseService<Integer, MusicGroupSchoolTermCourseDetail> {
+
+    MusicGroupSchoolTermCourseDetail findByMusicGroupId(String musicGroupId);
+
+    MusicGroupSchoolTermCourseDetail upset(MusicGroupSchoolTermCourseDetail musicGroupSchoolTermCourseDetail);
+
+}

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSchoolTermStudentCourseDetailService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail;
+import com.ym.mec.common.service.BaseService;
+
+public interface MusicGroupSchoolTermStudentCourseDetailService extends BaseService<Long, MusicGroupSchoolTermStudentCourseDetail> {
+
+}

+ 308 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.*;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.NO;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.SPAN_GROUP_CLASS_ADJUST;
@@ -163,6 +164,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
     private EmployeeDao employeeDao;
+    @Autowired
+    private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
+    @Autowired
+    private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -2023,7 +2028,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseSchedule.setType(classGroup4MixDto.getCourseType());
                     courseSchedule.setGroupType(MUSIC);
                     courseSchedule.setOrganId(musicGroup.getOrganId());
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                    if (classGroup4MixDto.getCourseType().equals(MIX)) {
                         courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
                     } else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
                         courseSchedule.setName(classGroup.getName());
@@ -2163,7 +2168,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseSchedule.setTeacherId(teacherId);
                 courseSchedule.setActualTeacherId(teacherId);
                 courseSchedule.setClassGroupId(classGroup.getId());
-                if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                if (classGroup4MixDto.getCourseType().equals(MIX)) {
                     courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
                 } else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
                     courseSchedule.setName(classGroup.getName());
@@ -2544,7 +2549,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
                     courseSchedule.setType(classGroup4MixDto.getCourseType());
 
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                    if (classGroup4MixDto.getCourseType().equals(MIX)) {
                         courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
                     } else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
                         courseSchedule.setName(classGroup.getName());
@@ -2626,6 +2631,279 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult preCourseSchedule(List<ClassGroup4MixDto> classGroup4MixDtos) {
+        Date date = new Date();
+        Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
+        String musicGroupId = classGroup4MixDtos.get(0).getMusicGroupId();
+        Integer musicGroupSchoolTermCourseDetailId = classGroup4MixDtos.get(0).getMusicGroupSchoolTermCourseDetailId();
+        ClassGroup classGroup = classGroupDao.get(classGroupId);
+        if (classGroup == null) {
+            throw new BizException("班级不存在");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+
+        Boolean confirmGenerate = false;
+        if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
+            confirmGenerate = classGroup4MixDtos.get(0).getConfirmGenerate();
+        }
+
+        TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+        if (classGroup.getType().equals(HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.MUSIC_NETWORK)) {
+            teachMode = TeachModeEnum.ONLINE;
+        }
+        if (classGroup4MixDtos.get(0).getCourseTimes().compareTo(0) <= 0) {
+            throw new BizException("排课次数必须大于0");
+        }
+//        Integer courseTimes = classGroup4MixDtos.get(0).getCourseTimes();
+
+//        classGroupService.updateTotalClassTimes(classGroup.getId(), courseTimes);
+
+        Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
+
+        List<Subject> subjectList = subjectService.findBySubjectByIdList(classGroup.getSubjectIdList());
+
+        String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
+
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        //2、获取班级学生
+        List<StudentRegistration> studentList = classGroupStudentMapperDao.findClassStudentList(classGroup.getId(), ClassGroupStudentStatusEnum.NORMAL);
+
+        List<Integer> studentIds = studentList.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
+
+//        Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIds);
+
+        //计算每节课的课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        List<CourseSchedule> courseScheduleList = new ArrayList<>();
+        MusicGroupSchoolTermCourseDetail schoolTermCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
+        for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            //3、插入班级排课信息
+            LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
+
+            int totalCourseMinutes = classGroup4MixDto.getExpectStudentNum() * classGroup4MixDto.getCourseMinutes();
+            if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
+                    classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
+                //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
+                if(totalCourseMinutes > 44 * 45){
+                    throw new BizException("操作失败:单技课和合奏课最大的排课时长不能超过{}分钟",44*45);
+                }
+                if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
+                    //获取所选学员最大的已消耗的单技课时长
+                    int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
+                    if(44 * 45 - maxSingleCourseMinutes > totalCourseMinutes){
+                        throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
+                    }
+                } else {
+                    int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
+                    if(44 * 45 - maxMixCourseMinutes > totalCourseMinutes){
+                        throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
+                    }
+                }
+            }
+            //获取班级学员最少可排课时长
+            int mixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
+            if(totalCourseMinutes > mixCourseMinutes){
+                throw new BizException("操作失败:所选部分学员可排课时间不足");
+            }
+
+            int totalCourseTimes = 0;
+            int generateCourseTimes = 0;
+            if (!CollectionUtils.isEmpty(classGroup4MixDto.getCourseTimeDtoList())) {
+                totalCourseTimes = classGroup4MixDto.getCourseTimeDtoList().stream().mapToInt(CourseTimeDto::getExpectCourseNum).reduce(0, Integer::sum);
+            }
+
+            Set<String> holidayDays = new HashSet<>();
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if (Objects.nonNull(holidaySetting) && StringUtils.isNotBlank(holidaySetting.getParanValue())) {
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+            }
+
+            Set<Integer> allTeacherIds = new HashSet<>();
+            List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
+            if(!confirmGenerate){
+                for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+                    List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+                    Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
+                    if(!CollectionUtils.isEmpty(teacherIds)){
+                        allTeacherIds.addAll(teacherIds);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                    allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
+                }
+            }
+
+            WhileNode:
+            while (true) {
+                int dayOfWeek = now.getDayOfWeek().getValue();
+                for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+                    List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+
+                    Set<Integer> noRepeatTeacherIds = newClassGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (noRepeatTeacherIds.size() != newClassGroupTeacherMapperList.size()) {
+                        throw new BizException("主教与助教存在冲突");
+                    }
+
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if(Objects.isNull(teacherId)){
+                        throw new BizException("请设置主教");
+                    }
+
+                    if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
+                        throw new BizException("排课循环周期错误,请核查");
+                    }
+                    if (Objects.isNull(courseTimeDto.getStartDate()) || Objects.isNull(courseTimeDto.getEndDate())) {
+                        throw new BizException("排课循环周期错误,请核查");
+                    }
+                    //排课截止时间不可超过学期截止日期
+                    if(courseTimeDto.getEndDate().compareTo(schoolTermCourseDetail.getEndSchoolTerm()) > 0){
+                        throw new BizException("操作失败:不可跨学期排课,请调整课程截止日期");
+                    }
+                    //排课开始时间不可小于预排课时间
+                    if(courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0){
+                        throw new BizException("操作失败:排课开始时间不可小于预排课时间");
+                    }
+
+                    //跳过节假日
+                    if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+                        continue;
+                    }
+
+                    if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
+
+                    Date classDate = DateConvertor.toDate(now);
+
+                    if (courseTimeDto.getStartDate().compareTo(classDate) > 0
+                            || courseTimeDto.getEndDate().compareTo(classDate) < 0
+                            || courseTimeDto.getExpectCourseNum() <= courseTimeDto.getCourseNum()) {
+                        if (courseTimeDto.getEndDate().compareTo(classDate) < 0 && courseTimeDto.getExpectCourseNum() > courseTimeDto.getCourseNum()) {
+                            throw new BizException("在指定的排课时间段内({}-{})无法完成预计课时数的排课", DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy.MM.dd"), DateUtil.dateToString(courseTimeDto.getEndDate(), "yyyy.MM.dd"));
+                        }
+                        if (totalCourseTimes <= generateCourseTimes) {
+                            break WhileNode;
+                        }
+                        continue;
+                    }
+
+                    //课时长度
+//                    long classCourseDuration = Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
+//                            LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+//                            .toMinutes();
+//
+//                    totalCourseDuration += classCourseDuration;
+
+                    courseTimeDto.setCourseNum(courseTimeDto.getCourseNum() + 1);
+                    generateCourseTimes += 1;
+
+                    if (totalCourseTimes < generateCourseTimes) {
+                        break WhileNode;
+                    }
+
+                    String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
+                    String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
+
+                    CourseSchedule courseSchedule = new CourseSchedule();
+                    courseSchedule.setSchoolId(schoolId);
+                    courseSchedule.setClassGroupId(classGroup.getId());
+                    courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                    courseSchedule.setClassDate(classDate);
+                    courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+                    if (date.compareTo(courseSchedule.getStartClassTime()) > 0) {
+                        throw new BizException("课程开始时间不得早于当前时间");
+                    }
+                    courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+                    courseSchedule.setCreateTime(date);
+                    courseSchedule.setUpdateTime(date);
+                    courseSchedule.setTeachMode(teachMode);
+                    courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
+                    courseSchedule.setType(classGroup4MixDto.getCourseType());
+
+                    if (classGroup4MixDto.getCourseType().equals(MIX)) {
+                        courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
+                    } else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
+                        courseSchedule.setName(classGroup.getName());
+                    } else {
+                        courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
+                    }
+
+                    courseSchedule.setGroupType(MUSIC);
+                    courseSchedule.setTeacherId(teacherId);
+                    courseSchedule.setActualTeacherId(teacherId);
+                    courseSchedule.setOrganId(musicGroup.getOrganId());
+                    courseSchedule.setClassGroupType(classGroup.getType().getCode());
+                    courseSchedule.setIsLock(1);
+                    courseSchedule.setPreCourseFlag(1);
+                    courseScheduleDao.insert(courseSchedule);
+                    courseScheduleList.add(courseSchedule);
+
+                    if(!confirmGenerate){
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                        SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
+                        if(Objects.nonNull(mainTeacher)){
+                            courseSchedule.setActualTeacherName(mainTeacher.getUserName());
+                        }
+                        List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
+                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                            courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
+                        }
+                    }
+
+                    for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
+                        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                        courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+                        courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+                        courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+                        courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+                        courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+                        courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+                        courseScheduleTeacherSalary.setCreateTime(date);
+                        courseScheduleTeacherSalary.setUpdateTime(date);
+                        courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+                        courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+                        if (confirmGenerate && !classGroup4MixDto.getAllowZeroSalary() && BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary()) == 0) {
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
+                        }
+                    }
+                }
+
+                now = now.plusDays(1);
+            }
+
+//            if (totalCourseDuration > totalMinutes) {
+//                throw new BizException("课程时长不足");
+//            }
+        }
+
+        courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
+
+        if (!confirmGenerate) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            courseScheduleList.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+            return BaseController.failed(HttpStatus.PARTIAL_CONTENT, courseScheduleList, "");
+        }
+
+        //老师结算表
+        if (courseScheduleTeacherSalaryList.size() > 0) {
+//            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+            courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        }
+
+        if (!CollectionUtils.isEmpty(studentList)) {
+//            studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
+
+            //学生结算表
+            courseScheduleStudentPaymentService.createForMemberMusicGroup(musicGroupId, courseScheduleList, studentIds);
+        }
+        /*if (musicGroup.getStatus() == PROGRESS) {
+            imUserFriendService.refreshClassImUserFriend(classGroupId);
+        }*/
+        return BaseController.succeed(classGroup);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public ClassGroup classGroupSnap(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception {
         Date date = new Date();
         String musicGroupId = classGroup4MixDtos.get(0).getMusicGroupId();
@@ -2798,7 +3076,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseSchedule.setType(classGroup4MixDto.getCourseType());
                     courseSchedule.setGroupType(MUSIC);
                     courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                    if (classGroup4MixDto.getCourseType().equals(MIX)) {
                         courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
                     } else {
                         courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
@@ -3100,6 +3378,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
         Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null));
+        Map<Integer, Long> preTotalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreTotalNumByClassGroupId(classGroupSet));
         Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
 
         for (ClassGroupTeachersDto classGroup : classGroups) {
@@ -3111,13 +3390,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroup.setClassGroupTeacherMapperList(classGroupTeacherMappers);
             classGroup.setStudentNum(studyNums.get(classGroup.getId()));
             int totalClassTimes = 0;
+            int preTotalClassTimes = 0;
             int currentClassTimes = 0;
+            if (preTotalNumMap.containsKey(classGroup.getId())) {
+                preTotalClassTimes = preTotalNumMap.get(classGroup.getId()).intValue();
+            }
             if (totalNumMap.containsKey(classGroup.getId())) {
                 totalClassTimes = totalNumMap.get(classGroup.getId()).intValue();
             }
             if (currentNumMap.containsKey(classGroup.getId())) {
                 currentClassTimes = currentNumMap.get(classGroup.getId()).intValue();
             }
+            classGroup.setPreTotalClassTimes(preTotalClassTimes);
             classGroup.setTotalClassTimes(totalClassTimes);
             classGroup.setCurrentClassTimes(currentClassTimes);
         }
@@ -4223,4 +4507,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //如果是基础技能班,重新计算老师课酬
         batchUpdateTeacherSalary(classGroupIds);
     }
+
+    @Override
+    public List<CourseSchedule> queryPreCourseList(Integer classGroupId) {
+        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseList(classGroupId);
+        if(courseSchedules.size() > 0){
+            List<Long> courseIdList = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
+            Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherIdMap(courseIdList,"BISHOP"));
+            Map<Long, String> teachingTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherIdMap(courseIdList,"TEACHING"));
+            for (CourseSchedule courseSchedule : courseSchedules) {
+                courseSchedule.setActualTeacherName(bishopTeacherMap.get(courseSchedule.getId()));
+                courseSchedule.setTeachingTeacherNames(teachingTeacherMap.get(courseSchedule.getId()));
+            }
+        }
+        return courseSchedules;
+    }
+
+    @Override
+    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
+        return null;
+    }
 }

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -549,6 +549,47 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 	@Override
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public void createForMemberMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds) {
+		Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCourseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+		List<CourseScheduleStudentPayment> css = courseScheduleStudentPaymentDao.getWithGroup(musicGroupId, GroupType.MUSIC, studentIds);
+		Map<Integer, Set<Long>> studentCourseIdsMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(css)){
+			studentCourseIdsMap = css.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId, Collectors.mapping(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.toSet())));
+		}
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+
+		for (Integer studentId : studentIds) {
+			Set<Long> existCourseIds = new HashSet<>();
+			if(studentCourseIdsMap.containsKey(studentId)){
+				existCourseIds = studentCourseIdsMap.get(studentId);
+			}
+			for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
+				String batchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, studentId, courseScheduleTypeListEntry.getKey(),null);
+				courseScheduleTypeListEntry.getValue().sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+				for (CourseSchedule courseSchedule : courseScheduleTypeListEntry.getValue()) {
+					if(existCourseIds.contains(courseSchedule.getId())){
+						throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
+					}
+					CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
+					cssp.setGroupType(courseSchedule.getGroupType());
+					cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
+					cssp.setCourseScheduleId(courseSchedule.getId());
+					cssp.setClassGroupId(courseSchedule.getClassGroupId());
+					cssp.setBatchNo(batchNo);
+					cssp.setUserId(studentId);
+					cssp.setOriginalPrice(BigDecimal.ZERO);
+					cssp.setExpectPrice(BigDecimal.ZERO);
+					cssp.setActualPrice(BigDecimal.ZERO);
+					cssp.setBeMerged(false);
+					courseScheduleStudentPayments.add(cssp);
+				}
+			}
+		}
+		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public void updateForMusicGroupWithPaymentCalender(String batchNo) {
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByBatchNo(batchNo);
 		if(CollectionUtils.isEmpty(courseScheduleStudentPayments)){

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankOrganizationFeeMapperServiceImpl.java

@@ -53,6 +53,12 @@ public class MemberRankOrganizationFeeMapperServiceImpl extends BaseServiceImpl<
 		if(memberFeeSetting == null){
 			throw new BizException("修改失败: 请设置收费标准");
 		}
+		if(feeMapper.getOrganId() != memberRankOrganizationFeeMapper.getOrganId()){
+			MemberRankOrganizationFeeMapper organIdAndRankId = memberRankOrganizationFeeMapperDao.findByOrganIdAndRankId(memberRankOrganizationFeeMapper.getOrganId(), memberRankOrganizationFeeMapper.getMemberRankSettingId());
+			if(organIdAndRankId != null){
+				throw new BizException("修改失败: 该分部会员收费标准已存在");
+			}
+		}
 		memberFeeSetting.setId(feeMapper.getMemberFeeSettingId());
 		memberFeeSettingService.update(memberFeeSetting);
 		memberRankOrganizationFeeMapperDao.update(memberRankOrganizationFeeMapper);

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.MemberRankPrivilegesDao;
 import com.ym.mec.biz.dal.dao.MemberRankSettingDao;
+import com.ym.mec.biz.dal.entity.MemberRankPrivileges;
 import com.ym.mec.biz.dal.entity.MemberRankSetting;
 import com.ym.mec.biz.service.MemberRankSettingService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, MemberRankSetting>  implements MemberRankSettingService {
@@ -40,7 +42,11 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
     @Override
     public MemberRankSetting getDetail(Integer memberRankSettingId) {
 		MemberRankSetting memberRankSetting = memberRankSettingDao.get(memberRankSettingId);
-		memberRankSetting.setMemberRankPrivileges(memberRankPrivilegesDao.findByRankSettingId(memberRankSettingId));
+		List<MemberRankPrivileges> byRankSettingId = memberRankPrivilegesDao.findByRankSettingId(memberRankSettingId);
+		if(byRankSettingId != null && byRankSettingId.size() > 0){
+			memberRankSetting.setMemberRankPrivileges(byRankSettingId);
+			memberRankSetting.setMemberPrivilegesItemIdList(byRankSettingId.stream().map(e->e.getMemberPrivilegesId()).collect(Collectors.toList()));
+		}
 		return memberRankSetting;
     }
 

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -202,9 +202,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		// 获取设置的课程收费标准
 		List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList = musicGroupPaymentCalenderDto
 				.getMusicGroupPaymentCalenderCourseSettingsList();
-//		if (musicGroupPaymentCalenderCourseSettingsList == null) {
-//			musicGroupPaymentCalenderCourseSettingsList = new ArrayList<>();
-//		}
 
 		if(musicGroupPaymentCalenderCourseSettingsList != null){
 			// 必须课程缴费金额为0时,报名、续费不能建多期

+ 132 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java

@@ -0,0 +1,132 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentMemberCourseDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail;
+import com.ym.mec.biz.service.MusicGroupSchoolTermCourseDetailService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl<Integer, MusicGroupSchoolTermCourseDetail>  implements MusicGroupSchoolTermCourseDetailService {
+	
+	@Autowired
+	private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
+	@Autowired
+	private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
+	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+
+	@Override
+	public BaseDAO<Integer, MusicGroupSchoolTermCourseDetail> getDAO() {
+		return musicGroupSchoolTermCourseDetailDao;
+	}
+
+    @Override
+    public MusicGroupSchoolTermCourseDetail findByMusicGroupId(String musicGroupId) {
+		return musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId,null);
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public MusicGroupSchoolTermCourseDetail upset(MusicGroupSchoolTermCourseDetail musicGroupSchoolTermCourseDetail) {
+		Date startCourseDate = musicGroupSchoolTermCourseDetail.getStartCourseDate();
+		String musicGroupId = musicGroupSchoolTermCourseDetail.getMusicGroupId();
+		MusicGroupSchoolTermCourseDetail courseDetail = musicGroupSchoolTermCourseDetailDao.
+				findByCourseDateAndMusicGroupId(musicGroupId,startCourseDate);
+		Date date = DateUtil.stringToDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+		if(startCourseDate != null && DateUtil.daysBetween(date, startCourseDate) < 0){
+			//如果所选时间小于当前时间
+			throw new BizException("操作失败:开课时间不得小于当前时间");
+		}
+		if(courseDetail != null){
+			if(startCourseDate != null){
+				//如果是重新选择的预排课时间
+				if(DateUtil.daysBetween(startCourseDate, courseDetail.getStartCourseDate()) != 0){
+					//删除乐团预排的课程
+					courseScheduleStudentPaymentDao.deletePreCourse(musicGroupId);
+					courseScheduleTeacherSalaryDao.deletePreCourse(musicGroupId);
+					courseScheduleDao.deletePreCourse(musicGroupId);
+					courseDetail.setStartCourseDate(startCourseDate);
+					getCourseDetail(courseDetail);
+					musicGroupSchoolTermCourseDetailDao.update(courseDetail);
+					//删除学员排课时长
+					musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(courseDetail.getId());
+					//生成学员可排课时长
+					MusicGroupSchoolTermStudentCourseDetail studentCourseDetail = new MusicGroupSchoolTermStudentCourseDetail();
+					studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(courseDetail.getId());
+					studentCourseDetail.setMemberCourseMinutes(courseDetail.getTotalCourseTime());
+					//获取乐团所有在读学员
+					List<Integer> studentIds = studentRegistrationDao.queryNormalUser(musicGroupId);
+					if(studentIds == null || studentIds.size() == 0){
+						throw new BizException("操作失败:该乐团没有在读学员");
+					}
+					musicGroupSchoolTermStudentCourseDetailDao.init(studentCourseDetail,studentIds);
+				}
+			}else {
+				//如果所选时间小于当前时间
+				if(DateUtil.daysBetween(date, courseDetail.getStartCourseDate()) < 0){
+					throw new BizException("开课时间不得小于当前时间,请重新配置");
+				}
+			}
+		}else {
+			if(startCourseDate != null){
+				courseDetail = new MusicGroupSchoolTermCourseDetail();
+				courseDetail.setMusicGroupId(musicGroupId);
+				courseDetail.setCourseFlag(false);
+				courseDetail.setStartCourseDate(startCourseDate);
+				getCourseDetail(courseDetail);
+				musicGroupSchoolTermCourseDetailDao.insert(courseDetail);
+				//生成学员可排课时长
+				MusicGroupSchoolTermStudentCourseDetail studentCourseDetail = new MusicGroupSchoolTermStudentCourseDetail();
+				studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(courseDetail.getId());
+				studentCourseDetail.setMemberCourseMinutes(courseDetail.getTotalCourseTime());
+				//获取乐团所有在读学员
+				List<Integer> studentIds = studentRegistrationDao.queryNormalUser(musicGroupId);
+				if(studentIds == null || studentIds.size() == 0){
+					throw new BizException("操作失败:该乐团没有在读学员");
+				}
+				musicGroupSchoolTermStudentCourseDetailDao.init(studentCourseDetail,studentIds);
+			}
+		}
+		return courseDetail;
+	}
+
+	private MusicGroupSchoolTermCourseDetail getCourseDetail(MusicGroupSchoolTermCourseDetail courseDetail){
+		Date startCourseDate = courseDetail.getStartCourseDate();
+		//一个学期默认为6个月,9月1日—2月28、29日,3月1日—8月31日
+		Integer month = Integer.parseInt(DateUtil.getMonth(startCourseDate));
+		String year = DateUtil.getYear(startCourseDate);
+		if(month >= 9 && month <= 2){
+			if(month >= 9){
+				year = DateUtil.getYear(DateUtil.addYears(startCourseDate, 1));
+			}
+			courseDetail.setEndSchoolTerm(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(year + "-02-01")));
+		}else {
+			courseDetail.setEndSchoolTerm(DateUtil.stringToDate(year + "-08-31 00:00:00"));
+		}
+		courseDetail.setStartSchoolTerm(startCourseDate);
+		//计算可排课时长
+//		int week = LocalDateTime.ofInstant(startCourseDate.toInstant(),DateUtil.zoneId).getDayOfWeek().getValue();
+		int week = DateUtil.date2Week1(startCourseDate);
+		int weekSize = DateUtil.getWeekDays(startCourseDate, courseDetail.getEndSchoolTerm(), week).size();
+		courseDetail.setTotalCourseTime(weekSize * 4 * 45);
+		courseDetail.setStartCourseDate(startCourseDate);
+		return courseDetail;
+	}
+}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermStudentCourseDetailServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.common.dal.BaseDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail;
+import com.ym.mec.biz.service.MusicGroupSchoolTermStudentCourseDetailService;
+import com.ym.mec.biz.dal.dao.MusicGroupSchoolTermStudentCourseDetailDao;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MusicGroupSchoolTermStudentCourseDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupSchoolTermStudentCourseDetail>  implements MusicGroupSchoolTermStudentCourseDetailService {
+	
+	@Autowired
+	private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
+
+	@Override
+	public BaseDAO<Long, MusicGroupSchoolTermStudentCourseDetail> getDAO() {
+		return musicGroupSchoolTermStudentCourseDetailDao;
+	}
+	
+}

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

@@ -2160,6 +2160,9 @@
         WHERE music_group_id_ = #{groupId}
           AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </delete>
+    <delete id="deletePreCourse">
+        DELETE FROM course_schedule WHERE music_group_id_ = #{musicGroupId} AND group_type_ = 'MUSIC' AND pre_course_flag_ = 1
+    </delete>
 
     <select id="queryUnsignedStudentList" resultMap="StudentAttendance">
         SELECT cssp.user_id_,
@@ -2312,6 +2315,15 @@
         AND cs.del_flag_ = 0
         GROUP BY cs.class_group_id_
     </select>
+    <select id="countPreTotalNumByClassGroupId" resultType="java.util.Map">
+        SELECT cs.class_group_id_ 'key',COUNT(cs.id_) 'value' FROM course_schedule cs
+        WHERE cs.class_group_id_ IN
+        <foreach collection="classGroupIds" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        AND cs.del_flag_ = 0 AND pre_course_flag_ = 1
+        GROUP BY cs.class_group_id_
+    </select>
     <select id="countCurrentNumByClassGroupId" resultType="java.util.Map">
         SELECT cs.class_group_id_ 'key',COUNT(cs.id_) 'value' FROM course_schedule cs
         WHERE cs.class_group_id_ IN
@@ -3858,4 +3870,7 @@
                 #{courseId}
             </foreach>
     </select>
+    <select id="queryPreCourseList" resultMap="CourseSchedule">
+        SELECT * FROM course_schedule WHERE class_group_id_ = 1 AND is_lock_ = 1 AND pre_course_flag_ = 1
+    </select>
 </mapper>

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

@@ -430,8 +430,12 @@
 	<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>
+    <delete id="deletePreCourse">
+		DELETE FROM course_schedule_student_payment WHERE course_schedule_id_ IN (
+		SELECT id_ FROM course_schedule WHERE music_group_id_ = #{musicGroupId} AND group_type_ = 'MUSIC' AND pre_course_flag_ = 1)
+	</delete>
 
-	<select id="queryStudentNotStartCourseTimesOfOnline" resultMap="studentCourseTimesDto">
+    <select id="queryStudentNotStartCourseTimesOfOnline" resultMap="studentCourseTimesDto">
 		SELECT cssp.`user_id_`,count(*) totalTimes,
 		sum(CASE pg.type_ WHEN 'FREE' THEN 0 WHEN 'CHARGE' THEN 1 END) practiceTmes,
 		sum(case when (pg.type_='FREE' AND cssp.`group_type_` = 'PRACTICE' ) then 1 ELSE 0 END) freePracticeTimes

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

@@ -598,8 +598,12 @@
 	<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>
+	<delete id="deletePreCourse">
+		DELETE FROM course_schedule_teacher_salary WHERE course_schedule_id_ IN (
+			SELECT id_ FROM course_schedule WHERE music_group_id_ = #{musicGroupId} AND group_type_ = 'MUSIC' AND pre_course_flag_ = 1)
+	</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 - 2
mec-biz/src/main/resources/config/mybatis/MemberRankOrganizationFeeMapperMapper.xml

@@ -17,6 +17,7 @@
 		<result column="rank_name_" property="rankName" />
 		<result column="organ_name_" property="organName" />
 		<association property="memberFeeSetting" javaType="com.ym.mec.biz.dal.entity.MemberFeeSetting">
+			<result property="id" column="member_fee_setting_id_"/>
 			<result property="currentDayFee" column="current_day_fee_"/>
 			<result property="originalDayFee" column="original_day_fee_"/>
 			<result property="currentMonthFee" column="current_month_fee_"/>
@@ -33,7 +34,7 @@
 		FROM member_rank_organization_fee_mapper mrofm
 		LEFT JOIN member_rank_setting mrs ON  mrofm.member_rank_setting_id_ = mrs.id_
 		LEFT JOIN organization o ON o.id_ = mrofm.organ_id_
-		WHERE id_ = #{id}
+		WHERE mrofm.id_ = #{id}
 	</select>
 	
 	<!-- 全查询 -->
@@ -72,7 +73,7 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="MemberRankOrganizationFeeMapper" parameterType="map">
-		SELECT mrofm.*,o.name_ organ_name_,mrs.name_ rank_name_,mfs.*
+		SELECT mrofm.*,o.name_ organ_name_,mrs.name_ rank_name_,mfs.*,mfs.id_ member_fee_setting_id_
 		FROM member_rank_organization_fee_mapper mrofm
 		LEFT JOIN member_rank_setting mrs ON  mrofm.member_rank_setting_id_ = mrs.id_
 		LEFT JOIN member_fee_setting mfs ON mfs.id_ = mrofm.member_fee_setting_id_

+ 85 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermCourseDetailMapper.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.MusicGroupSchoolTermCourseDetailDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail" id="MusicGroupSchoolTermCourseDetail">
+		<result column="id_" property="id" />
+		<result column="music_group_id_" property="musicGroupId" />
+		<result column="start_course_date_" property="startCourseDate" />
+		<result column="start_school_term_" property="startSchoolTerm" />
+		<result column="end_school_term_" property="endSchoolTerm" />
+		<result column="course_flag_" property="courseFlag" />
+		<result column="total_course_time_" property="totalCourseTime" />
+		<result column="update_time_" property="updateTime" />
+		<result column="create_time_" property="createTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="MusicGroupSchoolTermCourseDetail" >
+		SELECT * FROM music_group_school_term_course_detail WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="MusicGroupSchoolTermCourseDetail">
+		SELECT * FROM music_group_school_term_course_detail ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO music_group_school_term_course_detail (music_group_id_,start_course_date_,start_school_term_,
+	   end_school_term_,course_flag_,total_course_time_,update_time_,create_time_)
+	   VALUES(#{musicGroupId},#{startCourseDate},#{startSchoolTerm},#{endSchoolTerm},#{courseFlag},#{totalCourseTime},NOW(),NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail">
+		UPDATE music_group_school_term_course_detail <set>
+		<if test="courseFlag != null">
+			course_flag_ = #{courseFlag},
+		</if>
+		<if test="startCourseDate != null">
+			start_course_date_ = #{startCourseDate},
+		</if>
+		<if test="endSchoolTerm != null">
+			end_school_term_ = #{endSchoolTerm},
+		</if>
+		<if test="totalCourseTime != null">
+			total_course_time_ = #{totalCourseTime},
+		</if>
+		<if test="startSchoolTerm != null">
+			start_school_term_ = #{startSchoolTerm},
+		</if>
+		<if test="musicGroupId != null">
+			music_group_id_ = #{musicGroupId},
+		</if>
+			update_time_ = NOW()
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM music_group_school_term_course_detail WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="MusicGroupSchoolTermCourseDetail" parameterType="map">
+		SELECT * FROM music_group_school_term_course_detail ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM music_group_school_term_course_detail
+	</select>
+	<select id="findByCourseDateAndMusicGroupId" resultMap="MusicGroupSchoolTermCourseDetail">
+		SELECT * FROM music_group_school_term_course_detail
+		WHERE music_group_id_ = #{musicGroupId}
+		<if test="startCourseDate != null">
+		  AND (#{startCourseDate} >= start_school_term_ OR #{startCourseDate} &lt;= end_school_term_)
+		</if>
+		AND course_flag_ = 0
+	</select>
+</mapper>

+ 136 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermStudentCourseDetailMapper.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.MusicGroupSchoolTermStudentCourseDetailDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail" id="MusicGroupSchoolTermStudentCourseDetail">
+		<result column="id_" property="id" />
+		<result column="music_group_school_term_course_detail_id_" property="musicGroupSchoolTermCourseDetailId" />
+		<result column="user_id_" property="userId" />
+		<result column="member_course_minutes_" property="memberCourseMinutes" />
+		<result column="pre_member_course_minutes_" property="preMemberCourseMinutes" />
+		<result column="pre_course_detail_" property="preCourseDetail" />
+		<result column="mix_course_minutes_" property="mixCourseMinutes" />
+		<result column="single_course_minutes_" property="singleCourseMinutes" />
+		<result column="total_course_minutes_" property="totalCourseMinutes" />
+		<result column="used_course_minutes_" property="usedCourseMinutes" />
+		<result column="course_detail_" property="courseDetail" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="MusicGroupSchoolTermStudentCourseDetail" >
+		SELECT * FROM music_group_school_term_student_course_detail WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="MusicGroupSchoolTermStudentCourseDetail">
+		SELECT * FROM music_group_school_term_student_course_detail ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO music_group_school_term_student_course_detail
+		    (music_group_school_term_course_detail_id_,user_id_,member_course_minutes_,
+		   pre_member_course_minutes_,pre_course_detail_,total_course_minutes_,used_course_minutes_,
+		   course_detail_,mix_course_minutes_,single_course_minutes_,create_time_,update_time_)
+		   VALUES(#{musicGroupSchoolTermCourseDetailId},#{userId},#{memberCourseMinutes},#{preMemberCourseMinutes},
+		          #{preCourseDetail},#{totalCourseMinutes},#{usedCourseMinutes},#{courseDetail},#{mixCourseMinutes},#{singleCourseMinutes},NOW(),NOW())
+	</insert>
+	<insert id="init">
+		INSERT INTO music_group_school_term_student_course_detail
+		(music_group_school_term_course_detail_id_,user_id_,member_course_minutes_,create_time_,update_time_)
+		VALUES
+		<foreach collection="studentIds" item="userId" separator=",">
+			(#{studentCourseDetail.musicGroupSchoolTermCourseDetailId},#{userId},#{studentCourseDetail.memberCourseMinutes},NOW(),NOW())
+		</foreach>
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail">
+		UPDATE music_group_school_term_student_course_detail <set>
+		<if test="mixCourseMinutes != null">
+			mix_course_minutes_ = #{mixCourseMinutes},
+		</if>
+		<if test="singleCourseMinutes != null">
+			single_course_minutes_ = #{singleCourseMinutes},
+		</if>
+		<if test="usedCourseMinutes != null">
+			used_course_minutes_ = #{usedCourseMinutes},
+		</if>
+		<if test="totalCourseMinutes != null">
+			total_course_minutes_ = #{totalCourseMinutes},
+		</if>
+		<if test="userId != null">
+			user_id_ = #{userId},
+		</if>
+		<if test="preCourseDetail != null">
+			pre_course_detail_ = #{preCourseDetail},
+		</if>
+		<if test="musicGroupSchoolTermCourseDetailId != null">
+			music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId},
+		</if>
+		<if test="memberCourseMinutes != null">
+			member_course_minutes_ = #{memberCourseMinutes},
+		</if>
+		<if test="preMemberCourseMinutes != null">
+			pre_member_course_minutes_ = #{preMemberCourseMinutes},
+		</if>
+		<if test="courseDetail != null">
+			course_detail_ = #{courseDetail},
+		</if>
+			update_time_ = NOW()
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM music_group_school_term_student_course_detail WHERE id_ = #{id} 
+	</delete>
+	<delete id="deleteByDetailId">
+		DELETE FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{courseDetailId}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="MusicGroupSchoolTermStudentCourseDetail" parameterType="map">
+		SELECT * FROM music_group_school_term_student_course_detail ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM music_group_school_term_student_course_detail
+	</select>
+
+	<select id="getMixCourseMinutes" resultType="java.lang.Integer">
+		SELECT MIN(member_course_minutes_ - pre_member_course_minutes_)
+		FROM music_group_school_term_student_course_detail
+		WHERE music_group_school_term_course_detail_id_ = #{courseDetailId} AND user_id_ IN
+		<foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+			#{userId}
+		</foreach>
+		GROUP BY music_group_school_term_course_detail_id_
+	</select>
+	<select id="getMaxSingleCourseMinutes" resultType="java.lang.Integer">
+		SELECT MAX(single_course_minutes_)
+		FROM music_group_school_term_student_course_detail
+		WHERE music_group_school_term_course_detail_id_ = #{courseDetailId} AND user_id_ IN
+		<foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+			#{userId}
+		</foreach>
+		GROUP BY music_group_school_term_course_detail_id_
+	</select>
+
+	<select id="getMaxMixCourseMinutes" resultType="java.lang.Integer">
+		SELECT MAX(mix_course_minutes_)
+		FROM music_group_school_term_student_course_detail
+		WHERE music_group_school_term_course_detail_id_ = #{courseDetailId} AND user_id_ IN
+		<foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+			#{userId}
+		</foreach>
+		GROUP BY music_group_school_term_course_detail_id_
+	</select>
+</mapper>

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

@@ -851,6 +851,12 @@
         AND FIND_IN_SET(sr.music_group_id_, #{musicGroupIds})
         GROUP BY sr.music_group_id_
     </select>
+    <select id="queryNormalUser" resultType="integer">
+        SELECT sr.user_id_
+        FROM student_registration sr
+        WHERE sr.music_group_status_ != 'QUIT'
+        AND sr.music_group_id_ = #{musicGroupIds}
+    </select>
     <select id="queryUserByPhone" resultMap="StudentRegistration">
         SELECT su.id_,
         CASE WHEN sut.name_ IS NULL THEN su.real_name_ ELSE sut.name_ END parents_name_,

+ 15 - 2
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -971,11 +971,11 @@ public class DateUtil {
 		List<Date> dates = new ArrayList<>();
 		for (Date x = startTime; x.compareTo(endTime) <= 0;) {
 			calendar.setTime(x);
-			calendar.add(Calendar.DATE, 1);
-			x = calendar.getTime();
 			if (calendar.get(Calendar.DAY_OF_WEEK) == weekNum) {
 				dates.add(x);
 			}
+			calendar.add(Calendar.DATE, 1);
+			x = calendar.getTime();
 		}
 		return dates;
 	}
@@ -1212,6 +1212,19 @@ public class DateUtil {
 	}
 
 	/**
+	 * @describe 时间转换为星期数
+	 * @author Joburgess
+	 * @date 2019/10/28
+	 * @param date: 日期
+	 * @return java.lang.String
+	 */
+	public static int date2Week1(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(Calendar.DAY_OF_WEEK);
+	}
+
+	/**
 	 * 获取当前时间到0点的毫秒数
 	 * @return
 	 */

+ 22 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -269,6 +269,28 @@ public class ClassGroupController extends BaseController {
         return classGroupService.classGroupUpdate(classGroup4MixDtos);
     }
 
+    @ApiOperation(value = "会员乐团预排课")
+    @PostMapping("/preClassGroupUpdate")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/preCourseSchedule')")
+    @ApiImplicitParams({@ApiImplicitParam(name = "ClassGroup4MixDto", value = "会员乐团预排课", required = true, dataType = "String")})
+    public HttpResponseResult preCourseSchedule(@RequestBody List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception {
+        return classGroupService.preCourseSchedule(classGroup4MixDtos);
+    }
+
+    @ApiOperation(value = "确认预排课")
+    @PostMapping("/confirmPreCourseSchedule")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/confirmPreCourseSchedule')")
+    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) throws Exception {
+        return classGroupService.confirmPreCourseSchedule(musicGroupSchoolTermCourseDetailId);
+    }
+
+    @ApiOperation(value = "获取班级的预排课课程列表")
+    @PostMapping("/queryPreCourseList")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/queryPreCourseList')")
+    public Object queryPreCourseList(Integer classGroupId){
+        return succeed(classGroupService.queryPreCourseList(classGroupId));
+    }
+
     @ApiOperation(value = "小班报名详情")
     @GetMapping("/highClassGroups")
     @PreAuthorize("@pcs.hasPermissions('classGroup/highClassGroups')")

+ 26 - 0
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupSchoolTermCourseDetailController.java

@@ -0,0 +1,26 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
+import com.ym.mec.biz.service.MusicGroupSchoolTermCourseDetailService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("musicGroupSchoolTermCourseDetail")
+@Api(tags = "会员乐团每学期排课安排")
+@RestController
+public class MusicGroupSchoolTermCourseDetailController extends BaseController {
+
+	@Autowired
+	private MusicGroupSchoolTermCourseDetailService musicGroupSchoolTermCourseDetailService;
+
+	@ApiOperation("新增、修改乐团预排课详情")
+	@GetMapping(value = "upset")
+	public Object upset(MusicGroupSchoolTermCourseDetail musicGroupSchoolTermCourseDetail) {
+		return succeed(musicGroupSchoolTermCourseDetailService.upset(musicGroupSchoolTermCourseDetail));
+	}
+}