Browse Source

Merge branch 'saas' into 20220930

liujunchi 2 years ago
parent
commit
7dd571e5d5
61 changed files with 2196 additions and 262 deletions
  1. 1 1
      mec-auth/mec-auth-server/src/main/resources/bootstrap-test.properties
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  4. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherFreeCourseDao.java
  5. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java
  6. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleConvertDao.java
  7. 6 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  8. 2 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  10. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertClassDto.java
  11. 73 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDetailDto.java
  12. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDto.java
  13. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertLogDto.java
  14. 45 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java
  15. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java
  16. 246 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java
  17. 210 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  19. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ConvertLogQueryInfo.java
  20. 5 12
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  21. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  22. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java
  23. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherFreeCourseService.java
  24. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseConvertLogService.java
  25. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java
  26. 9 7
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  27. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  28. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  29. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  30. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  31. 48 92
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  32. 46 61
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  33. 37 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  34. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherFreeCourseServiceImpl.java
  35. 128 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java
  36. 266 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java
  37. 180 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  38. 57 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  39. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  40. 3 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  41. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  42. 22 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantAssetsInfoServiceImpl.java
  44. 10 4
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  45. 9 6
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  46. 14 2
      mec-biz/src/main/resources/config/mybatis/CloudTeacherFreeCourseMapper.xml
  47. 100 0
      mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml
  48. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkTemplateMapper.xml
  49. 44 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleConvert.xml
  50. 30 7
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  51. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  52. 4 6
      mec-biz/src/main/resources/config/mybatis/StudentBasicInfoMapper.xml
  53. 2 2
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  54. 2 5
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  55. 1 1
      mec-student/src/main/resources/bootstrap-test.properties
  56. 4 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  57. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  58. 76 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java
  59. 0 3
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java
  60. 1 1
      mec-web/src/main/resources/bootstrap-test.properties
  61. 1 0
      mec-web/src/main/resources/columnMapper_修改商品导入.ini

+ 1 - 1
mec-auth/mec-auth-server/src/main/resources/bootstrap-test.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f753d9d9-4bb2-4df6-a483-da9e169617c4
+spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

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

@@ -857,4 +857,13 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @return
      */
     List<Map<Integer, String>> queryStudentClassGroupMap(String musicGroupId);
+
+    /**
+    * @description: 当前班级是否包含未开始的转换课
+     * @param classIdList
+    * @return java.lang.Boolean
+    * @author zx
+    * @date 2022/9/29 18:14 
+    */
+    Boolean hasConvertCourse(@Param("classIdList") List<Integer> classIdList);
 }

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

@@ -488,4 +488,6 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
                                                      @Param("teacherId") Integer teacherId, @Param("musicGroupId") String musicGroupId);
     
     List<ClassGroupStudentMapperDto> queryByClassGroupType(@Param("musicGroupId") String musicGroupId,@Param("classGroupType") ClassGroupTypeEnum classGroupType,@Param("teacherRole") TeachTypeEnum teacherRole, @Param("studentIdList") List<Integer> studentIdList);
+
+    Integer countByUserIdsAndClassIds(@Param("studentIds") String studentIds, @Param("oldClassId") Integer oldClassId);
 }

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

@@ -9,4 +9,8 @@ import java.util.List;
 public interface CloudTeacherFreeCourseDao extends BaseDAO<Long, CloudTeacherFreeCourse> {
 
     void batchInsert(@Param("scheduleIdList") String scheduleIdList, @Param("calenderId") Long calenderId);
+
+    void deleteByCourseIds(@Param("courseIdList") List<Long> courseIdList);
+
+    Integer countByCourseIdList(@Param("courseIdList") List<Long> courseIdList);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.CourseConvertDetailDto;
+import com.ym.mec.biz.dal.dto.CourseConvertLogDto;
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import com.ym.mec.common.dal.BaseDAO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface CourseConvertLogDao extends BaseDAO<Integer, CourseConvertLog> {
+
+    void updateRevoke(Integer courseConvertId);
+
+    int countConvertPage(Map<String, Object> params);
+
+    List<CourseConvertLogDto> queryConvertPage(Map<String, Object> params);
+
+    List<CourseConvertDetailDto> queryCourse(Integer courseConvertId);
+}

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleConvertDao.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CourseScheduleConvertDao {
+
+    /**
+    * @description: 获取符合课程转换要求的课程数量,用于校验
+     * @param courseIds
+    * @return int
+    * @author zx
+    * @date 2022/9/21 10:33
+    */
+    int countLegalCourse(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 校验所选课程是否所有学员的课程数量一致
+     * @param courseIds
+     * @param courseNum
+    * @return java.lang.String
+    * @author zx
+    * @date 2022/9/21 11:40
+    */
+    Integer checkStudentCourseNum(@Param("courseIds") String courseIds, @Param("courseNum") int courseNum);
+
+    /**
+    * @description: 获取可转换课程时长,学员数量,课程数量
+     * @param courseIds
+    * @return com.ym.mec.biz.dal.dto.CourseConvertSumDto
+    * @author zx
+    * @date 2022/9/21 14:48 
+    */
+    CourseConvertSumDto sumCourseConvert(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 获取课程关联的学员列表
+     * @param courseIds
+    * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
+    * @author zx
+    * @date 2022/9/21 15:16
+    */
+    List<BasicUserDto> queryStudents(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 获取课关联的班级数量
+     * @param courseIds
+    * @return int
+    * @author zx
+    * @date 2022/9/21 16:42
+    */
+    int countClassNum(@Param("courseIds") String courseIds);
+}

+ 6 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -7,7 +7,6 @@ import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.page.CourseDetailQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
-
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
@@ -44,6 +43,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     int batchAddCourseSchedules(List<CourseSchedule> courseSchedules);
 
+    int batchInsert(List<CourseSchedule> courseSchedules);
+
     /**
      * @param courseScheduleId: 课程编号
      * @param status:           状态
@@ -66,7 +67,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     int batchDeleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
-    int batchDeleteCourseSchedulesWithoutCheck(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+    int batchDelete(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     int batchDeleteCourseSchedulesWithLogic(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
@@ -1955,10 +1956,12 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     * @date 2022/9/6 14:07
     */
     void markFreeCourse(@Param("courseIds") String courseIds);
-    
+
     /**
      * 查询已开课乐团列表
      * @return
      */
     List<String> queryStartedCourseMusicGroupIdList(String groupType);
+
+    void batchUpdateDelFlag(@Param("courseIds") String courseIds);
 }

+ 2 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -39,10 +39,10 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
      * @Author: Joburgess
      * @Date: 2019/10/15
-     * @params [ids]
+     * @params [courseIdList]
      * @describe 根据课程编号批量获取学生缴费信息
      */
-    List<CourseScheduleStudentPayment> findByCourseScheduleIds(@Param("ids") List<Long> ids);
+    List<CourseScheduleStudentPayment> findByCourseScheduleIds(@Param("courseIdList") List<Long> courseIdList);
 
     /**
      * 删除学生对应的课程
@@ -617,5 +617,4 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<StudentOrganDto> queryRemainCourseStudent(@Param("organIds") List<Integer> organIds);
-
 }

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

@@ -77,7 +77,7 @@ public class ClassGroup4MixDto implements Cloneable{
     private Boolean allowZeroSalary = false;
 
     @ApiModelProperty(value = "确认生成课程")
-    private Boolean confirmGenerate;
+    private Boolean confirmGenerate = false;
 
     @ApiModelProperty(value = "预排课学期编号")
     private Integer musicGroupSchoolTermCourseDetailId;

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertClassDto.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class CourseConvertClassDto{
+
+    @ApiModelProperty(value = "是否继续提交")
+    private Boolean checkCourseTimesFlag = false;
+
+    @ApiModelProperty(value = "老师设置", required = true)
+    private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+    @ApiModelProperty(value = "排课次数", required = true)
+    private Integer courseTimes;
+
+    @ApiModelProperty(value = "排课循环方式", required = true)
+    private List<CourseTimeDto> courseTimeDtoList;
+
+    @ApiModelProperty(value = "是否允许0课酬")
+    private Boolean allowZeroSalary = false;
+
+    @ApiModelProperty(value = "确认生成课程")
+    private Boolean confirmGenerate = false;
+
+    public Boolean getCheckCourseTimesFlag() {
+        return checkCourseTimesFlag;
+    }
+
+    public void setCheckCourseTimesFlag(Boolean checkCourseTimesFlag) {
+        this.checkCourseTimesFlag = checkCourseTimesFlag;
+    }
+
+    public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+        return classGroupTeacherMapperList;
+    }
+
+    public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+        this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+    }
+
+    public Integer getCourseTimes() {
+        return courseTimes;
+    }
+
+    public void setCourseTimes(Integer courseTimes) {
+        this.courseTimes = courseTimes;
+    }
+
+    public List<CourseTimeDto> getCourseTimeDtoList() {
+        return courseTimeDtoList;
+    }
+
+    public void setCourseTimeDtoList(List<CourseTimeDto> courseTimeDtoList) {
+        this.courseTimeDtoList = courseTimeDtoList;
+    }
+
+    public Boolean getAllowZeroSalary() {
+        return allowZeroSalary;
+    }
+
+    public void setAllowZeroSalary(Boolean allowZeroSalary) {
+        this.allowZeroSalary = allowZeroSalary;
+    }
+
+    public Boolean getConfirmGenerate() {
+        return confirmGenerate;
+    }
+
+    public void setConfirmGenerate(Boolean confirmGenerate) {
+        this.confirmGenerate = confirmGenerate;
+    }
+}

+ 73 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDetailDto.java

@@ -0,0 +1,73 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+public class CourseConvertDetailDto {
+
+    @ApiModelProperty(value = "课程编号")
+    private Long courseId;
+
+    @ApiModelProperty(value = "班级名称")
+    private String className;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectName;
+
+    @ApiModelProperty(value = "老师名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程状态")
+    private CourseStatusEnum status;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public CourseStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(CourseStatusEnum status) {
+        this.status = status;
+    }
+}

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDto.java

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
+
+import java.util.List;
+
+public class CourseConvertDto {
+
+    private List<ClassGroupDto> classGroups;
+
+    public List<ClassGroupDto> getClassGroups() {
+        return classGroups;
+    }
+
+    public void setClassGroups(List<ClassGroupDto> classGroups) {
+        this.classGroups = classGroups;
+    }
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertLogDto.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import io.swagger.annotations.ApiModelProperty;
+
+public class CourseConvertLogDto extends CourseConvertLog {
+
+    @ApiModelProperty(value = "转换课程数")
+    private Integer convertCourseNum;
+
+    @ApiModelProperty(value = "转换后班级数")
+    private Integer convertAfterClassNum;
+
+    @ApiModelProperty(value = "转换后课程数")
+    private Integer convertAfterCourseNum;
+
+    public Integer getConvertCourseNum() {
+        return convertCourseNum;
+    }
+
+    public void setConvertCourseNum(Integer convertCourseNum) {
+        this.convertCourseNum = convertCourseNum;
+    }
+
+    public Integer getConvertAfterClassNum() {
+        return convertAfterClassNum;
+    }
+
+    public void setConvertAfterClassNum(Integer convertAfterClassNum) {
+        this.convertAfterClassNum = convertAfterClassNum;
+    }
+
+    public Integer getConvertAfterCourseNum() {
+        return convertAfterCourseNum;
+    }
+
+    public void setConvertAfterCourseNum(Integer convertAfterCourseNum) {
+        this.convertAfterCourseNum = convertAfterCourseNum;
+    }
+}

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+
+public class CourseConvertSumDto {
+    private Integer courseNum;
+
+    private CourseSchedule.CourseScheduleType courseType;
+
+    private Integer studentNum;
+
+    private Integer courseMinute;
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public CourseSchedule.CourseScheduleType getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
+        this.courseType = courseType;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    public Integer getCourseMinute() {
+        return courseMinute;
+    }
+
+    public void setCourseMinute(Integer courseMinute) {
+        this.courseMinute = courseMinute;
+    }
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java

@@ -40,7 +40,7 @@ public class CourseTimeDto {
     @ApiModelProperty(value = "是否跳过节假日 true-跳过 false-不跳过", required = true)
     private Boolean isHoliday = false;
 
-    @ApiModelProperty(value = "老师设置", required = true)
+    @ApiModelProperty(value = "课程老师设置", required = true)
     private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
 
     public int getExpectCourseMinutes() {

+ 246 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java

@@ -0,0 +1,246 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.dto.CourseTimeDto;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ClassGroupDto extends BaseEntity {
+
+	@ApiModelProperty(value = "是否确认生成课程", required = true)
+	private Boolean confirmGenerate = false;
+
+	@ApiModelProperty(value = "是否转换课", required = true)
+	private Boolean convertFlag = true;
+
+	@ApiModelProperty(value = "排课校验方式:0按总时长,1按课次", required = true)
+	private int checkType = 0;
+
+	@ApiModelProperty(value = "选择的需要转换的课程编号", required = true)
+	private String courseIds;
+
+	@ApiModelProperty(value = "班级编号", required = true)
+	private Integer classGroupId;
+
+	@NotNull(message = "课程组类型不能为空")
+	@ApiModelProperty(value = "课程组类型", required = true)
+	private GroupType groupType;
+
+	@ApiModelProperty(value = "确认0元课酬", required = true)
+	private Boolean allowZeroSalary = false;
+
+	/**  */
+	@ApiModelProperty(value = "乐团编号", required = true)
+	private String musicGroupId;
+
+	/**  */
+	@ApiModelProperty(value = "科目编号(多个,号分割)", required = true)
+	private String subjectIdList;
+
+	@NotBlank(message = "学生编号不能为空")
+	@ApiModelProperty(value = "学生编号(多个,号分割)", required = true)
+	private String userIds;
+
+	/** 班级名称 */
+	@ApiModelProperty(value = "班级名称", required = true)
+	private String name;
+
+	/** 预计招生人数 */
+	@ApiModelProperty(value = "预计招生人数", required = true)
+	private Integer expectStudentNum;
+
+	@ApiModelProperty(value = "学生数量", required = false)
+	private Integer studentNum;
+
+	/** 班级类型(普通班级、合奏班级) */
+	@ApiModelProperty(value = "课程类型", required = true)
+	@NotNull(message = "课程类型不能为空")
+	private CourseSchedule.CourseScheduleType courseScheduleType = CourseSchedule.CourseScheduleType.HIGH_ONLINE;
+
+	/** 班级类型(普通班级、合奏班级) */
+	@ApiModelProperty(value = "课程类型", required = true)
+	@NotNull(message = "课程类型不能为空")
+	private ClassGroupTypeEnum type;
+
+	@ApiModelProperty(value = "班级老师设置", required = true)
+	private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+	@ApiModelProperty(value = "排课周期", required = true)
+	private List<CourseTimeDto> courseTimeDtoList;
+
+	@ApiModelProperty(value = "获取可转换的课程时长", required = true)
+	Map<String, Integer> courseTypeMinutesMap;
+
+	@ApiModelProperty(value = "老师课酬", required = true)
+	List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+
+	@ApiModelProperty(value = "学员课程关联", required = true)
+	List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+
+	public ClassGroupTypeEnum getType() {
+		return type;
+	}
+
+	public CourseSchedule.CourseScheduleType getCourseScheduleType() {
+		return courseScheduleType;
+	}
+
+	public void setCourseScheduleType(CourseSchedule.CourseScheduleType courseScheduleType) {
+		this.courseScheduleType = courseScheduleType;
+	}
+
+	public void setType(ClassGroupTypeEnum type) {
+		this.type = type;
+	}
+
+	public Boolean getConfirmGenerate() {
+		return confirmGenerate;
+	}
+
+	public void setConfirmGenerate(Boolean confirmGenerate) {
+		this.confirmGenerate = confirmGenerate;
+	}
+
+	public List<CourseScheduleStudentPayment> getCourseScheduleStudentPayments() {
+		return courseScheduleStudentPayments;
+	}
+
+	public void setCourseScheduleStudentPayments(List<CourseScheduleStudentPayment> courseScheduleStudentPayments) {
+		this.courseScheduleStudentPayments = courseScheduleStudentPayments;
+	}
+
+	public List<CourseScheduleTeacherSalary> getCourseScheduleTeacherSalaryList() {
+		return courseScheduleTeacherSalaryList;
+	}
+
+	public void setCourseScheduleTeacherSalaryList(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList) {
+		this.courseScheduleTeacherSalaryList = courseScheduleTeacherSalaryList;
+	}
+
+	public Boolean getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(Boolean convertFlag) {
+		this.convertFlag = convertFlag;
+	}
+
+	public int getCheckType() {
+		return checkType;
+	}
+
+	public void setCheckType(int checkType) {
+		this.checkType = checkType;
+	}
+
+	public String getCourseIds() {
+		return courseIds;
+	}
+
+	public void setCourseIds(String courseIds) {
+		this.courseIds = courseIds;
+	}
+
+	public Map<String, Integer> getCourseTypeMinutesMap() {
+		return courseTypeMinutesMap;
+	}
+
+	public void setCourseTypeMinutesMap(Map<String, Integer> courseTypeMinutesMap) {
+		this.courseTypeMinutesMap = courseTypeMinutesMap;
+	}
+
+	public Boolean getAllowZeroSalary() {
+		return allowZeroSalary;
+	}
+
+	public void setAllowZeroSalary(Boolean allowZeroSalary) {
+		this.allowZeroSalary = allowZeroSalary;
+	}
+
+	public Integer getStudentNum() {
+		return studentNum;
+	}
+
+	public void setStudentNum(Integer studentNum) {
+		this.studentNum = studentNum;
+	}
+
+	public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+		return classGroupTeacherMapperList;
+	}
+
+	public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+		this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+	}
+
+	public Integer getClassGroupId() {
+		return classGroupId;
+	}
+
+	public void setClassGroupId(Integer classGroupId) {
+		this.classGroupId = classGroupId;
+	}
+
+	public GroupType getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(GroupType groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public String getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(String subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
+
+	public String getUserIds() {
+		return userIds;
+	}
+
+	public void setUserIds(String userIds) {
+		this.userIds = userIds;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getExpectStudentNum() {
+		return expectStudentNum;
+	}
+
+	public void setExpectStudentNum(Integer expectStudentNum) {
+		this.expectStudentNum = expectStudentNum;
+	}
+
+	public List<CourseTimeDto> getCourseTimeDtoList() {
+		return courseTimeDtoList;
+	}
+
+	public void setCourseTimeDtoList(List<CourseTimeDto> courseTimeDtoList) {
+		this.courseTimeDtoList = courseTimeDtoList;
+	}
+}

+ 210 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java

@@ -0,0 +1,210 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+/**
+ * 对应数据库表(course_convert_log):
+ */
+public class CourseConvertLog {
+
+	private Integer id;
+	
+	@ApiModelProperty(value = "乐团编号")
+	private String musicGroupId;
+
+	@ApiModelProperty(value = "学员编号列表")
+	private String studentIds;
+
+	/** 转换前课程编号 */
+	@ApiModelProperty(value = "转换前课程编号")
+	private String oldCourseIds;
+	
+	/** 转换前班级编号 */
+	@ApiModelProperty(value = "转换前班级编号")
+	private Integer oldClassId;
+
+	/** 转换前班级编号 */
+	@ApiModelProperty(value = "转换前班级")
+	private String oldClassName;
+	
+	@ApiModelProperty(value = "转换前课表")
+	private String oldCourseJson;
+
+	@ApiModelProperty(value = "转换前老师课酬")
+	private String oldCourseTeacherSalaryJson;
+
+	@ApiModelProperty(value = "转换前课程学员关联")
+	private String oldCourseStudentMapperJson;
+	
+	/** 转换前的老师考勤记录 */
+	@ApiModelProperty(value = "转换前的老师考勤记录")
+	private String oldTeacherAttendanceJson;
+	
+	/** 转换后的课程编号 */
+	@ApiModelProperty(value = "转换后的课程编号")
+	private String newCourseIds;
+	
+	/** 转换后的班级编号 */
+	@ApiModelProperty(value = "转换后的班级编号")
+	private String newClassIds;
+
+	@ApiModelProperty(value = "操作人")
+	private Integer operator;
+
+	@ApiModelProperty(value = "操作人")
+	private String operatorName;
+
+	@ApiModelProperty(value = "是否还原")
+	private Boolean revokeFlag = false;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	public String getOldClassName() {
+		return oldClassName;
+	}
+
+	public void setOldClassName(String oldClassName) {
+		this.oldClassName = oldClassName;
+	}
+
+	public String getOperatorName() {
+		return operatorName;
+	}
+
+	public void setOperatorName(String operatorName) {
+		this.operatorName = operatorName;
+	}
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public String getStudentIds() {
+		return studentIds;
+	}
+
+	public void setStudentIds(String studentIds) {
+		this.studentIds = studentIds;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getOldCourseIds() {
+		return oldCourseIds;
+	}
+
+	public void setOldCourseIds(String oldCourseIds) {
+		this.oldCourseIds = oldCourseIds;
+	}
+
+	public Integer getOldClassId() {
+		return oldClassId;
+	}
+
+	public void setOldClassId(Integer oldClassId) {
+		this.oldClassId = oldClassId;
+	}
+
+	public String getOldCourseJson() {
+		return oldCourseJson;
+	}
+
+	public void setOldCourseJson(String oldCourseJson) {
+		this.oldCourseJson = oldCourseJson;
+	}
+
+	public String getOldCourseTeacherSalaryJson() {
+		return oldCourseTeacherSalaryJson;
+	}
+
+	public void setOldCourseTeacherSalaryJson(String oldCourseTeacherSalaryJson) {
+		this.oldCourseTeacherSalaryJson = oldCourseTeacherSalaryJson;
+	}
+
+	public String getOldCourseStudentMapperJson() {
+		return oldCourseStudentMapperJson;
+	}
+
+	public void setOldCourseStudentMapperJson(String oldCourseStudentMapperJson) {
+		this.oldCourseStudentMapperJson = oldCourseStudentMapperJson;
+	}
+
+	public String getOldTeacherAttendanceJson() {
+		return oldTeacherAttendanceJson;
+	}
+
+	public void setOldTeacherAttendanceJson(String oldTeacherAttendanceJson) {
+		this.oldTeacherAttendanceJson = oldTeacherAttendanceJson;
+	}
+
+	public String getNewCourseIds() {
+		return newCourseIds;
+	}
+
+	public void setNewCourseIds(String newCourseIds) {
+		this.newCourseIds = newCourseIds;
+	}
+
+	public String getNewClassIds() {
+		return newClassIds;
+	}
+
+	public void setNewClassIds(String newClassIds) {
+		this.newClassIds = newClassIds;
+	}
+
+	public Integer getOperator() {
+		return operator;
+	}
+
+	public void setOperator(Integer operator) {
+		this.operator = operator;
+	}
+
+	public Boolean getRevokeFlag() {
+		return revokeFlag;
+	}
+
+	public void setRevokeFlag(Boolean revokeFlag) {
+		this.revokeFlag = revokeFlag;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -201,6 +201,17 @@ public class CourseSchedule  extends BaseEntity{
 	//学员学习标准是否评价1是0否
 	private int evaluateFlag = 0;
 
+	//当前课程是否是转换课
+	private Boolean convertFlag = false;
+
+	public Boolean getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(Boolean convertFlag) {
+		this.convertFlag = convertFlag;
+	}
+
 	public int getEvaluateFlag() {
 		return evaluateFlag;
 	}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ConvertLogQueryInfo.java

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class ConvertLogQueryInfo extends QueryInfo {
+
+    private String operator;
+
+    private String operatorDate;
+
+    private String musicGroupId;
+
+    public String getOperator() {
+        return operator;
+    }
+
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    public String getOperatorDate() {
+        return operatorDate;
+    }
+
+    public void setOperatorDate(String operatorDate) {
+        this.operatorDate = operatorDate;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+}

+ 5 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -19,10 +20,12 @@ import java.util.List;
 import java.util.Map;
 
 public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
+
+    ClassGroupDao getDao();
 	
 	PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
-	
-	boolean create(ClassGroup classGroup);
+
+    Integer create(ClassGroup classGroup);
 
     /**
      * 查询老师乐团课课程
@@ -342,9 +345,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 
 
 
-    List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId);
-
-
     /**
      * 根据乐团跟声部获取提高班列表
      *
@@ -510,13 +510,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      */
     Map<String,Long> findClassCourseMinuteMap(List<Integer> classGroupIds,Map<String,Long> classCourseMinuteMap);
 
-    /**
-     * 获取基础技能班/线上基础技能班数量和容许最大数量
-     * @param musicGroupId
-     * @param type
-     * @return
-     */
-    HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type);
 
     /**
      * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
@@ -15,6 +17,8 @@ import java.util.Set;
 
 public interface ClassGroupStudentMapperService extends BaseService<Long, ClassGroupStudentMapper> {
 
+    ClassGroupStudentMapperDao getDao();
+
     /**
      * 查找班级学生对应关系
      * @param userId
@@ -100,4 +104,13 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
      */
     void updateClassGroupStudents1(Long classGroupId, List<Integer> studentIds, List<Long> allLockCourseIds, String batchNo, BigDecimal masterTotalPrice);
 
+    /**
+    * @description: 添加班级学员关联
+     * @param classGroup
+     * @param userIdStrSet
+    * @return void
+    * @author zx
+    * @date 2022/9/23 11:50
+    */
+    void addMapper(ClassGroup classGroup, List<Integer> userIdStrSet);
 }

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

@@ -1,6 +1,9 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.common.service.BaseService;
@@ -11,6 +14,7 @@ import java.util.Map;
 import java.util.Set;
 
 public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassGroupTeacherMapper> {
+    ClassGroupTeacherMapperDao getDao();
 
     /**
      * 批量插入班级老师
@@ -84,4 +88,22 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
      * @param newTeacherId
      */
     void batchUpdateTeacherByClassId(List<Integer> classGroupIds, Integer oldTeacherId,Integer newTeacherId);
+
+    /**
+    * @description: 添加班级老师关联
+     * @param groupDto
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2022/9/23 11:30
+    */
+    List<Integer> addMapper(ClassGroupDto groupDto);
+
+    /**
+    * @description: 校验老师是否冲突
+     * @param teacherMappers
+    * @return void
+    * @author zx
+    * @date 2022/9/23 14:45
+    */
+    void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers);
 }

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherFreeCourseService.java

@@ -3,7 +3,6 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dao.CloudTeacherFreeCourseDao;
 import com.ym.mec.biz.dal.entity.CloudTeacherFreeCourse;
 import com.ym.mec.common.service.BaseService;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -12,4 +11,13 @@ public interface CloudTeacherFreeCourseService extends BaseService<Long, CloudTe
     CloudTeacherFreeCourseDao getDao();
 
     void batchInsert(List<Long> scheduleIdList,Long calenderId);
+
+    /**
+    * @description: 云教练课程转换
+     * @param oldCourseIdList
+    * @return void
+    * @author zx
+    * @date 2022/9/28 09:52
+    */
+    void courseConvert(List<Long> oldCourseIdList,List<Long> courseIdList);
 }

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseConvertLogService.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dao.CourseConvertLogDao;
+import com.ym.mec.biz.dal.dto.CourseConvertDetailDto;
+import com.ym.mec.biz.dal.dto.CourseConvertLogDto;
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.page.ConvertLogQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+public interface CourseConvertLogService extends  BaseService<Integer, CourseConvertLog>{
+    CourseConvertLogDao getDao();
+
+    CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+              List<CourseScheduleTeacherSalary> teacherSalaries,
+              List<CourseScheduleStudentPayment> studentPayments);
+
+    PageInfo<CourseConvertLogDto> queryConvertPage(ConvertLogQueryInfo queryInfo);
+
+    List<CourseConvertDetailDto> queryCourse(Integer courseConvertId);
+}

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
+import com.ym.mec.common.entity.HttpResponseResult;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface CourseScheduleConvertService{
+
+    /**
+    * @description: 根据用户所选课程编号,查询出需要进行课程转换的学员列表,
+     * 并计算可转换课程时长,
+     * 1、校验学员剩余时长是否一致
+     * 2、所选课程是否未开始
+     * 3、课程类似是否一致
+     * 4、目前只能转换声部和集训声部为线上基础技能课。或者将线上基础技能课还原
+     * 5、老师课酬总额和原课酬总额一致,平铺到所有课程
+     * @param courseIds
+    * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
+    * @author zx
+    * @date 2022/9/21 10:15
+    */
+    HashMap<String, Object> queryConvertStudent(String courseIds);
+
+    /**
+    * @description: 课程转换
+     * @param classGroups
+    * @return java.lang.Boolean
+    * @author zx
+    * @date 2022/9/21 18:01
+    */
+    HttpResponseResult action(List<ClassGroupDto> classGroups);
+
+    /**
+    * @description: 课程转换还原
+     * @param courseConvertId
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2022/9/27 10:14
+    */
+    void revoke(Integer courseConvertId);
+}

+ 9 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -13,7 +13,6 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
-import com.ym.mec.common.tenant.TenantContextHolder;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.Date;
@@ -430,12 +429,6 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	List<CourseSchedule> findNoStartCoursesByClassGroupId(Integer classGroupId);
 
 	/**
-	 * 学生有课提醒
-	 * @return
-	 */
-	void studentCoursesScheduleRemind();
-
-	/**
 	 * 学生上课提醒
 	 */
 	void studentSignInRemind();
@@ -686,4 +679,13 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	* @date 2022/3/1 18:01
 	*/
 	PageInfo<StudentStandardDto> queryStudyStandardWaitVisit(EvaluateCourseQueryInfo queryInfo);
+
+	/**
+	* @description: 排课
+	 * @param groupDto
+	* @return void
+	* @author zx
+	* @date 2022/9/23 13:57
+	*/
+	HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto);
 }

+ 24 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -1,16 +1,21 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.common.service.BaseService;
+
 import java.util.List;
 import java.util.Map;
 
 public interface CourseScheduleStudentPaymentService extends BaseService<Long, CourseScheduleStudentPayment> {
 
+
+	CourseScheduleStudentPaymentDao getDao();
+
 	/**
 	 * @Author: Joburgess
 	 * @Date: 2019/10/14
@@ -130,4 +135,22 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 */
 	void updateCourseActualPrice(List<Long> courseIds);
 
+	/**
+	* @description: 初始化学员数据
+	 * @param studentIds
+	* @return void
+	* @author zx
+	* @date 2022/9/26 17:03
+	*/
+	List<CourseScheduleStudentPayment> init(List<CourseSchedule> courseSchedules,List<Integer> studentIds);
+
+	/**
+	* @description: 均摊学员课程价值
+	 * @param courseScheduleStudentPayments
+	 * @param studentPayments
+	* @return void
+	* @author zx
+	* @date 2022/9/26 18:08
+	*/
+    void splitStudentPayment(List<CourseScheduleStudentPayment> courseScheduleStudentPayments,List<CourseScheduleStudentPayment> studentPayments);
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
@@ -8,6 +9,7 @@ import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -15,6 +17,9 @@ import java.util.Map;
 
 public interface CourseScheduleTeacherSalaryService extends BaseService<Long, CourseScheduleTeacherSalary> {
 
+
+    CourseScheduleTeacherSalaryDao getDao();
+
     String TASK_KEY = "SETTLEMENT_TYPES";
 
     /**
@@ -190,6 +195,18 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalaries);
 
     /**
+     * @describe 计算乐团课教师课酬
+     * @author Joburgess
+     * @date 2020/12/16 0016
+     * @param musicGroup:
+     * @param courseSchedule:
+     * @param courseScheduleTeacherSalaries:
+     * @return void
+     */
+    void initMusicGroupCourseTeacherSalary(List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList,
+                                           CourseSchedule courseSchedule,MusicGroup musicGroup,List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList);
+
+    /**
      * @describe 获取指定课程上的教师信息
      * @author Joburgess
      * @date 2020/11/17 0017
@@ -303,4 +320,13 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     void todayIncomeRemind();
+
+    /**
+    * @description:均摊老师课酬
+    * @return void
+    * @author zx
+    * @date 2022/9/26 18:04
+    */
+    void splitTeacherSalary(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList, List<CourseScheduleTeacherSalary> teacherSalaries);
+
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -14,6 +15,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface StudentRegistrationService extends BaseService<Long, StudentRegistration> {
+    StudentRegistrationDao getDao();
 
     /**
      * 获取乐团学员报名详情

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

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dto.StudentStandardDto;
 import com.ym.mec.biz.dal.dto.TeacherAttendanceComplaintsDto;
 import com.ym.mec.biz.dal.dto.TeacherAttendanceDetailDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import com.ym.mec.biz.dal.page.TeacherAttendanceComplaintsQueryInfo;
@@ -16,6 +18,8 @@ import java.util.Map;
 
 public interface TeacherAttendanceService extends BaseService<Long, TeacherAttendance> {
 
+	TeacherAttendanceDao getDao();
+
 	/**
 	* @description: 处理学员学习标准是否达标
 	 * @param studentStandardDtos
@@ -154,4 +158,6 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param signOutDeviceNum
 	 */
 	void updateDeviceNum(Integer courseId, String userId,String signInDeviceNum, String signOutDeviceNum);
+
+	void addTeacherAttendance(List<CourseSchedule> courseScheduleList);
 }

+ 48 - 92
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -94,8 +94,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private SubjectService subjectService;
     @Autowired
-    private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
-    @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -157,8 +155,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
-    @Autowired
-    private CourseScheduleStatisticsService courseScheduleStatisticsService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -166,6 +162,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
+    public ClassGroupDao getDao() {
+        return classGroupDao;
+    }
+
+    @Override
     public PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo) {
         PageInfo<ClassGroup> pageInfo = new PageInfo<ClassGroup>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
@@ -185,7 +186,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (ClassGroup cg : dataList) {
                 Long studentNum = classGroupStudentNumMap.get(cg.getId());
                 cg.setStudentNum(Objects.isNull(studentNum) ? 0 : studentNum.intValue());
-                cg.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(cg.getId() + ""));
+                cg.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(cg.getId() + ""));
                 cg.setCourseScheduleList(courseScheduleDao.findCoursesByClassGroupId(cg.getId(), null));
             }
         }
@@ -195,20 +196,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean create(ClassGroup classGroup) {
-
+    @Transactional(rollbackFor = Exception.class)
+    public Integer create(ClassGroup classGroup) {
         if (classGroup.getType() == null) {
             throw new BizException("班级类型不能为空");
         }
         if (classGroup.getGroupType() == null) {
             throw new BizException("课程组类型不能为空");
         }
-        List<ClassGroupTeacherMapper> teacherMappers = classGroup.getTeacherMapperList();
-        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-        if (teacherMappers.size() != collect.size()) {
-            throw new BizException("主教与助教存在冲突");
-        }
+//        校验主教助教是否冲突
+        classGroupTeacherMapperService.checkTeachingBishop(classGroup.getTeacherMapperList());
 
         //疫情原因去掉这块限制
         //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
@@ -248,7 +245,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         if (teacherMapperList.size() > 0) {
-            classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(teacherMapperList);
         }
 
         //2、插入班级学生关联关系
@@ -303,7 +300,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     musicGroup.getName(), musicGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
         }
-        return true;
+        return classGroup.getId();
     }
 
     @Override
@@ -480,7 +477,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 // 删除基础提高班
                 classGroupDao.batchSoftDelete(classGroupIds);
                 // 删除基础提高老师
-                classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+                classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
 
                 List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupIds,
                         MUSIC);
@@ -1555,7 +1552,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Map<Long, Integer>> vipGroupOverCourses = courseScheduleDao.countGroupOverCourse(musicGroupIds, "VIP");
         Map<Long, Integer> vipGroupOverCourseMaps = MapUtil.convertIntegerMap(vipGroupOverCourses);
 
-        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperDao.findByClassGroupIdsAndType(classGroupIds, "BISHOP");
+        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperService.getDao().findByClassGroupIdsAndType(classGroupIds, "BISHOP");
         Map<Integer, Integer> classGroupTeacherMap = bishopTeachers.stream().collect(Collectors.toMap(ClassGroupTeacherMapper::getClassGroupId, ClassGroupTeacherMapper::getUserId));
 //        Map<Integer, ClassGroup> classGorupIdMap = byClassGroupIds.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
 
@@ -1719,16 +1716,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
-//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
+//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
 //        if (Objects.nonNull(teachingTeacher)) {
 //            teacherClassHeadInfo.setTeachingTeacherId(teachingTeacher.getId());
 //            teacherClassHeadInfo.setTeachingTeacher(teachingTeacher.getUserName());
@@ -1961,7 +1958,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -2320,7 +2317,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherIds.add(groupTeacherMapper.getUserId());
             }
             //3、将老师加入关联关系
-            classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
             //创建IM群组
             addImGroup(classGroup, userIds, teacherIds);
         }
@@ -2372,9 +2369,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) {
         Date date = new Date();
-        Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
-        String musicGroupId = classGroup4MixDtos.get(0).getMusicGroupId();
-//        Boolean checkCourseTimesFlag = classGroup4MixDtos.get(0).getCheckCourseTimesFlag();
+        ClassGroup4MixDto classGroup4MixDto1 = classGroup4MixDtos.get(0);
+        Integer classGroupId =classGroup4MixDto1.getClassGroupId();
+        String musicGroupId =classGroup4MixDto1.getMusicGroupId();
+//        Boolean checkCourseTimesFlag =classGroup4MixDto1.getCheckCourseTimesFlag();
         ClassGroup classGroup = classGroupDao.get(classGroupId);
         if (classGroup == null) {
             throw new BizException("班级不存在");
@@ -2382,8 +2380,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Boolean confirmGenerate = false;
-        if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
-            confirmGenerate = classGroup4MixDtos.get(0).getConfirmGenerate();
+        if (Objects.nonNull(classGroup4MixDto1.getConfirmGenerate())) {
+            confirmGenerate =classGroup4MixDto1.getConfirmGenerate();
         }
 
         TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
@@ -2392,9 +2390,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         //1、更新班级关联老师信息
-        if (Objects.nonNull(classGroup4MixDtos.get(0).getCourseAddType()) && classGroup4MixDtos.get(0).getCourseAddType().equals("onlyUpdateTeacher")) {
-            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
-            List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
+        if (Objects.nonNull(classGroup4MixDto1.getCourseAddType()) &&classGroup4MixDto1.getCourseAddType().equals("onlyUpdateTeacher")) {
+            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperService.getDao().findByClassGroup(classGroupId);
+            List<ClassGroupTeacherMapper> newTeacherMapperList =classGroup4MixDto1.getClassGroupTeacherMapperList();
             Set<Integer> collect = newTeacherMapperList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
             if (newTeacherMapperList.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
@@ -2421,14 +2419,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<Integer> classGroupIds = new ArrayList<>();
             classGroupIds.add(classGroupId);
             // 删除历史记录
-            classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+            classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
             for (ClassGroupTeacherMapper tm : newTeacherMapperList) {
                 tm.setClassGroupId(classGroupId);
                 tm.setCreateTime(date);
                 tm.setGroupType(GroupType.MUSIC);
                 tm.setMusicGroupId(musicGroupId);
                 tm.setUpdateTime(date);
-                classGroupTeacherMapperDao.insert(tm);
+                classGroupTeacherMapperService.getDao().insert(tm);
             }
             imUserFriendService.refreshClassImUserFriend(classGroupId);
             return BaseController.succeed(classGroup);
@@ -2789,7 +2787,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
         if (classGroups.size() > 0) {
             classGroups.forEach(e -> {
-                e.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(e.getId().toString()));
+                e.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(e.getId().toString()));
             });
         }
         return classGroups;
@@ -3165,7 +3163,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -3518,34 +3516,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId) {
-        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByMixClassGroupId(classGroupId);
-        String classGroupIds = "";
-        for (ClassGroupTeachersDto classGroupTeachersDto : classGroups) {
-            classGroupIds += classGroupTeachersDto.getId() + ",";
-        }
-        classGroupIds = classGroupIds.substring(0, classGroupIds.length() - 1);
-
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
-        for (ClassGroupTeachersDto classGroup : classGroups) {
-            List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
-            for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                if (!classGroup.getId().equals(classGroupTeacher.getClassGroupId())) continue;
-                classGroupTeacherMappers.add(classGroupTeacher);
-            }
-            classGroup.setClassGroupTeacherMapperList(classGroupTeacherMappers);
-        }
-        return classGroups;
-    }
-
-    @Override
     public List<HighClassGroupDto> findClassGroupByMusicGroupIdAndSubjectId(String musicGroupId, Integer subjectId) {
         List<HighClassGroupDto> highClassGroupList = classGroupDao.findClassGroupByMusicGroupIdAndSubjectId(musicGroupId, subjectId);
         for (HighClassGroupDto highClassGroup : highClassGroupList) {
             List<String> subjects = subjectService.findBySubIds(highClassGroup.getSubjectIdList());
             highClassGroup.setSubjectName(subjects.stream().collect(Collectors.joining(",")));
 
-            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
+            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
             highClassGroup.setTeacherName(bishopTeacher.getUserName());
             highClassGroup.setUserId(bishopTeacher.getUserId());
             CourseSchedule courseSchedule = courseScheduleDao.findOneCourseScheduleByClassGroupId(highClassGroup.getId());
@@ -3591,7 +3568,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         String classGroupIds = classGroups.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
         List<Integer> classGroupSet = classGroups.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().findClassGroupTeachers(classGroupIds);
         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, 0));
@@ -3679,7 +3656,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             String classGroupIds = dataList.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
             List<Integer> classGroupSet = dataList.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().findClassGroupTeachers(classGroupIds);
             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, 0));
@@ -3921,7 +3898,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (SuperClassGroupDto result : results) {
                 classGroupIds.add(result.getId());
             }
-            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperDao.findByClassGroupIds(classGroupIds);
+            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperService.getDao().findByClassGroupIds(classGroupIds);
             Map<Integer, Map<TeachTypeEnum, List<ClassGroupTeacherMapDto>>> classTeacherTypeMaps = classGroupTeacherMaps.stream()
                     .collect(Collectors.groupingBy(ClassGroupTeacherMapDto::getClassGroupId, Collectors.groupingBy(ClassGroupTeacherMapDto::getTeacherRole)));
             List<Group> groups = groupDao.findByClassGroupIds(classGroupIds);
@@ -4014,13 +3991,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
         if (classGroup.getType() == ClassGroupTypeEnum.VIP) {
@@ -4334,36 +4311,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId, ClassGroupTypeEnum type) {
-        //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
-        List<StudentRegistration> musicGroupStudents = studentRegistrationDao.findMusicGroupStudent(musicGroupId, null);
-        Map<Integer, List<StudentRegistration>> regMap = musicGroupStudents.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId));
-        int maxClassGroupNum = 0;
-        int otherSubjectRegNum = 0;
-        for (Map.Entry<Integer, List<StudentRegistration>> regEntry : regMap.entrySet()) {
-            //上低音号、长号 合并计算
-            if (regEntry.getKey().equals(14) || regEntry.getKey().equals(15)) {
-                otherSubjectRegNum += regEntry.getValue().size();
-                continue;
-            }
-            int classNum = regEntry.getValue().size() / 6;
-            classNum += (regEntry.getValue().size() % 6) > 0 ? 1 : 0;
-            maxClassGroupNum += classNum;
-        }
-        maxClassGroupNum += otherSubjectRegNum / 6;
-        maxClassGroupNum += (otherSubjectRegNum % 6) > 0 ? 1 : 0;
-        maxClassGroupNum += musicGroupStudents.size() / 30;
-        maxClassGroupNum += (musicGroupStudents.size() % 30) > 0 ? 1 : 0;
-
-        HighClassGroupNumDto highClassGroupNumDto = new HighClassGroupNumDto();
-        int nowClassGroupNum = classGroupDao.getMusicGroupHighClassNumBySubject(musicGroupId, type);
-
-        highClassGroupNumDto.setNowHighClassGroupNum(nowClassGroupNum);
-        highClassGroupNumDto.setMaxHighClassGroupNum(maxClassGroupNum);
-        return highClassGroupNumDto;
-    }
-
-    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId, String classGroupStudentMap, List<Integer> studentIds) {
         //获取主班剩余课程时长
@@ -4371,13 +4318,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (masterMap.size() <= 0) {
             throw new BizException("所选主班没有剩余课程,请重新选择");
         }
+        List<Map<String, String>> classGroupStudents = (List<Map<String, String>>) JSON.parse(classGroupStudentMap);
+        List<Integer> classIdList = classGroupStudents.stream().map(e -> e.entrySet().stream().map(k -> Integer.parseInt(k.getKey())).findFirst().get()).collect(Collectors.toList());
+//        Map<String, String> convertMybatisMap = MapUtil.convertMybatisMap(classGroupStudents);
+//        List<Integer> classIdList = convertMybatisMap.keySet().stream().map(e->Integer.parseInt(e)).collect(Collectors.toList());
+//        classIdList.add(masterClassGroupId);
+        Boolean hasConvertCourse = classGroupDao.hasConvertCourse(classIdList);
+        if(hasConvertCourse != null && hasConvertCourse){
+            throw new BizException("所选班级有转换课,请重新选择");
+        }
+        //主班
         //获取学员列表
         Map<Integer, String> userNames = MapUtil.convertMybatisMap(teacherDao.queryUsernameByIds(studentIds));
         Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(studentIds, ",")));
 
         Map<Integer, Integer> studentCLassMap = new HashMap<>();
         List<Map<Integer, BigDecimal>> surplusCourseFeeMapList = new ArrayList<>();
-        List<Map<String, String>> classGroupStudents = (List<Map<String, String>>) JSON.parse(classGroupStudentMap);
         //班级列表
         /*List<Integer> classGroupIds = classGroupStudents.stream().map(e -> Integer.parseInt(e.keySet().iterator().next())).collect(Collectors.toList());
         classGroupIds.add(masterClassGroupId);

+ 46 - 61
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -1,79 +1,35 @@
 package com.ym.mec.biz.service.impl;
 
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupRelation;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
-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.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.service.ClassGroupRelationService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-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.ImGroupMemberService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.service.*;
 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.http.HttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, ClassGroupStudentMapper> implements ClassGroupStudentMapperService {
 
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-
     @Autowired
     private CourseScheduleService courseScheduleService;
     @Autowired
-    StudentRegistrationService studentRegistrationService;
+    private StudentRegistrationService studentRegistrationService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
@@ -95,8 +51,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
-    private OrganizationCourseUnitPriceSettingsDao organizationCourseUnitPriceSettingsDao;
-    @Autowired
     private ClassGroupDao classGroupDao;
     @Autowired
     private MusicGroupDao musicGroupDao;
@@ -115,6 +69,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    public ClassGroupStudentMapperDao getDao() {
+        return classGroupStudentMapperDao;
+    }
+
+    @Override
     public ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(Integer userId, Integer classGroupId, String status) {
         return classGroupStudentMapperDao.findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, status);
     }
@@ -693,4 +652,30 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         imGroupMemberService.join(classGroupId.toString(), userRoleMap);
         imUserFriendService.refreshClassImUserFriend(classGroupId.intValue());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addMapper(ClassGroup classGroup, List<Integer> userIdList) {
+        if(CollectionUtils.isEmpty(userIdList)){
+            return;
+        }
+        List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
+        for (Integer userId : userIdList) {
+            ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+            classGroupStudentMapper.setClassGroupId(classGroup.getId());
+            classGroupStudentMapper.setUserId(userId);
+            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+            classGroupStudentMapper.setGroupType(classGroup.getGroupType());
+            classGroupStudentList.add(classGroupStudentMapper);
+
+            //原有业务逻辑,用于更新学员注册表班级信息
+            StudentRegistration studentRegistration = new StudentRegistration();
+            studentRegistration.setClassGroupId(classGroup.getId());
+            studentRegistration.setUserId(userId);
+            studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
+            studentRegistrationService.getDao().updateByUserIdAndMusicGroupId(studentRegistration);
+        }
+        classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
+    }
 }

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

@@ -3,13 +3,14 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,8 +35,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
     @Autowired
-    private SysConfigDao sysConfigDao;
-    @Autowired
     private ImGroupMemberService imGroupMemberService;
     @Autowired
     private ClassGroupService classGroupService;
@@ -45,10 +44,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private TeacherAttendanceDao teacherAttendanceDao;
     @Autowired
     private CourseScheduleDao courseScheduleDao;
-    @Autowired
-    private TeacherDao teacherDao;
-    @Autowired
-    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -56,6 +51,11 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    public ClassGroupTeacherMapperDao getDao() {
+        return classGroupTeacherMapperDao;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public int classGroupTeachersInsert(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
 
@@ -376,4 +376,33 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     public void batchUpdateTeacherByClassId(List<Integer> classGroupIds, Integer oldTeacherId, Integer newTeacherId) {
         classGroupTeacherMapperDao.batchUpdateTeacherByClassId(classGroupIds,oldTeacherId,newTeacherId);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Integer> addMapper(ClassGroupDto groupDto) {
+        List<ClassGroupTeacherMapper> teacherMapperList = groupDto.getClassGroupTeacherMapperList();
+        if(CollectionUtils.isEmpty(teacherMapperList)){
+            return new ArrayList<>();
+        }
+        List<Integer> teacherIdList = new ArrayList<>();
+        for (ClassGroupTeacherMapper tm : teacherMapperList) {
+            tm.setClassGroupId(groupDto.getClassGroupId());
+            tm.setMusicGroupId(groupDto.getMusicGroupId());
+            tm.setGroupType(groupDto.getGroupType());
+            tm.setTenantId(groupDto.getTenantId());
+            teacherIdList.add(tm.getUserId());
+        }
+        classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+        return teacherIdList;
+    }
+
+
+    //校验主教助教是否冲突
+    @Override
+    public void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers){
+        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        if (teacherMappers.size() != collect.size()) {
+            throw new BizException("主教与助教存在冲突");
+        }
+    }
 }

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

@@ -33,4 +33,12 @@ public class CloudTeacherFreeCourseServiceImpl extends BaseServiceImpl<Long, Clo
     public void batchInsert(List<Long> scheduleIdList,Long calenderId) {
 		cloudTeacherFreeCourseDao.batchInsert(StringUtils.join(scheduleIdList,","),calenderId);
     }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void courseConvert(List<Long> oldCourseIdList,List<Long> courseIdList) {
+		if(cloudTeacherFreeCourseDao.countByCourseIdList(oldCourseIdList) > 0){
+			cloudTeacherFreeCourseDao.batchInsert(StringUtils.join(courseIdList,","),null);
+		}
+    }
 }

+ 128 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java

@@ -0,0 +1,128 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CourseConvertDetailDto;
+import com.ym.mec.biz.dal.dto.CourseConvertLogDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.page.ConvertLogQueryInfo;
+import com.ym.mec.biz.service.CourseConvertLogService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class CourseConvertLogServiceImpl extends BaseServiceImpl<Integer, CourseConvertLog> implements CourseConvertLogService {
+
+	@Autowired
+	private CourseConvertLogDao courseConvertLogDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private TeacherAttendanceDao teacherAttendanceDao;
+	@Autowired
+	private SysUserService sysUserService;
+	@Autowired
+	private ClassGroupDao classGroupDao;
+
+	@Override
+	public BaseDAO<Integer, CourseConvertLog> getDAO() {
+		return courseConvertLogDao;
+	}
+
+	@Override
+	public CourseConvertLogDao getDao() {
+		return courseConvertLogDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+					 List<CourseScheduleTeacherSalary> teacherSalaries,
+					 List<CourseScheduleStudentPayment> studentPayments) {
+		SysUser user = sysUserService.getUser();
+		CourseConvertLog courseConvertLog = new CourseConvertLog();
+		courseConvertLog.setOperatorName(user.getRealName());
+		courseConvertLog.setOperator(user.getId());
+		courseConvertLog.setOldCourseIds(oldCourseIds);
+		String userIds = studentPayments.stream().map(e -> e.getUserId().toString()).distinct().collect(Collectors.joining(","));
+		courseConvertLog.setStudentIds(userIds);
+		List<Long> oldCourseIdList = Arrays.stream(oldCourseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+
+		//获取老师课酬json
+		courseConvertLog.setOldCourseTeacherSalaryJson(JSONObject.toJSONString(teacherSalaries));
+		//删除老师课酬
+		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(oldCourseIdList);
+
+		//获取学员课程价值
+		courseConvertLog.setOldCourseStudentMapperJson(JSONObject.toJSONString(studentPayments));
+		//删除学员课程价值
+		courseScheduleStudentPaymentDao.deleteByCourseSchedule(oldCourseIdList);
+
+		//获取课程列表
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(oldCourseIdList);
+		Integer oldClassId = courseSchedules.stream().map(e -> e.getClassGroupId()).findFirst().get();
+		ClassGroup classGroup = classGroupDao.get(oldClassId);
+		courseConvertLog.setMusicGroupId(classGroup.getMusicGroupId());
+		courseConvertLog.setOldClassId(oldClassId);
+		courseConvertLog.setOldClassName(classGroup.getName());
+		courseConvertLog.setOldCourseJson(JSONObject.toJSONString(courseSchedules));
+		//删除课程
+		courseScheduleDao.batchDelete(oldCourseIdList);
+
+		//记录老师考勤
+		List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findByCourseSchedules(oldCourseIdList);
+		courseConvertLog.setOldTeacherAttendanceJson(JSONObject.toJSONString(teacherAttendances));
+		//删除考勤
+		teacherAttendanceDao.batchDeleteByCourseSchedules(oldCourseIdList);
+
+		courseConvertLog.setNewCourseIds(StringUtils.join(courseIdList,","));
+		courseConvertLog.setNewClassIds(StringUtils.join(newClassGroupIds,","));
+		courseConvertLogDao.insert(courseConvertLog);
+		return courseConvertLog;
+	}
+
+	@Override
+	public PageInfo<CourseConvertLogDto> queryConvertPage(ConvertLogQueryInfo queryInfo) {
+		PageInfo<CourseConvertLogDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<CourseConvertLogDto> dataList = null;
+		int count = courseConvertLogDao.countConvertPage(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = courseConvertLogDao.queryConvertPage(params);
+			for (CourseConvertLogDto dto : dataList) {
+				dto.setConvertCourseNum(dto.getOldCourseIds().split(",").length);
+				dto.setConvertAfterClassNum(dto.getNewClassIds().split(",").length);
+				dto.setConvertAfterCourseNum(dto.getNewCourseIds().split(",").length);
+			}
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+    @Override
+    public List<CourseConvertDetailDto> queryCourse(Integer courseConvertId) {
+        return courseConvertLogDao.queryCourse(courseConvertId);
+    }
+}

+ 266 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java

@@ -0,0 +1,266 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.ym.mec.biz.dal.dao.CourseScheduleConvertDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
+
+@Service
+public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertService {
+
+    @Autowired
+    private CourseScheduleConvertDao courseScheduleConvertDao;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private ClassGroupTeacherMapperService classGroupTeacherMapperService;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private ClassGroupStudentMapperService classGroupStudentMapperService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+    @Autowired
+    private CourseConvertLogService courseConvertLogService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private TeacherAttendanceService teacherAttendanceService;
+    @Autowired
+    private CloudTeacherFreeCourseService cloudTeacherFreeCourseService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @Override
+    public HashMap<String, Object> queryConvertStudent(String courseIds) {
+        //校验课程是否可以进行转换
+        this.checkConvertCourseIds(courseIds);
+        //获取可转换课程时长,学员数量,课程数量
+        CourseConvertSumDto courseConvertSumDto = courseScheduleConvertDao.sumCourseConvert(courseIds);
+        //获取学员列表
+        List<BasicUserDto> basicUserDtos = Optional.ofNullable(courseScheduleConvertDao.queryStudents(courseIds)).
+                orElseThrow(()->new BizException("操作失败:所选课程没有学员"));
+        List<Integer> userIds = basicUserDtos.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+        Map<Integer,String> subjectMap = MapUtil.convertIntegerMap(studentDao.getStudentSubjectMapList(userIds));
+        basicUserDtos.stream().forEach(e->e.setSubjectName(subjectMap.get(e.getUserId())));
+        HashMap<String, Object> resultMap = new HashMap<>(2);
+        resultMap.put("courseConvertSum",courseConvertSumDto);
+        resultMap.put("students",basicUserDtos);
+        return resultMap;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult action(List<ClassGroupDto> classGroups) {
+        ClassGroupDto classGroupDto = classGroups.get(0);
+        //校验课程是否可以进行转换
+        this.checkConvertCourseIds(classGroupDto.getCourseIds());
+        if(!classGroupDto.getConfirmGenerate()){
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+        //校验主教助教是否冲突
+        classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+        int classNum = classGroups.size();
+        //课程列表
+        List<CourseSchedule> courseScheduleList = new ArrayList<>();
+        //老师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        //学员课程价值
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<Integer> studentIdList = new ArrayList<>();
+
+        for (ClassGroupDto groupDto : classGroups) {
+            List<Integer> userIdStrSet = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+            studentIdList.addAll(userIdStrSet);
+            groupDto.setStudentNum(userIdStrSet.size());
+            //创建班级
+            ClassGroup classGroup = new ClassGroup();
+            BeanUtils.copyProperties(groupDto,classGroup);
+            classGroupService.insert(classGroup);
+            groupDto.setClassGroupId(classGroup.getId());
+            //设置班级上的老师
+            classGroupTeacherMapperService.addMapper(groupDto);
+            //2、插入班级学生关联关系
+            classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
+            //排课
+            groupDto.setCheckType(classNum>1?1:0);
+            HttpResponseResult<List<CourseSchedule>> result = courseScheduleService.createCourse(groupDto);
+            if(result.getCode() != 200){
+                StringBuffer sb = new StringBuffer("班级");
+                result.setMsg(sb.append(classGroup.getName()).append(":").append(result.getMsg()).toString());
+                if(groupDto.getConfirmGenerate()){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                }
+                return result;
+            }else {
+                if(groupDto.getConfirmGenerate()){
+                    courseScheduleList.addAll(result.getData());
+                    courseScheduleTeacherSalaryList.addAll(groupDto.getCourseScheduleTeacherSalaryList());
+                    courseScheduleStudentPayments.addAll(groupDto.getCourseScheduleStudentPayments());
+                }else {
+                    List<CourseSchedule> schedules = result.getData();
+                    List<Integer> teacherIdList = schedules.stream().map(e -> e.getActualTeacherId()).collect(Collectors.toList());
+                    Map<Integer, String> maps = MapUtil.convertIntegerMap(teacherDao.queryNameByIdList(teacherIdList));
+                    for (CourseSchedule e : schedules) {e.setActualTeacherName(maps.get(e.getActualTeacherId()));}
+                    return result;
+                }
+            }
+        }
+        ClassGroupDto groupDto = classGroups.get(0);
+        String courseIds = groupDto.getCourseIds();
+        //获取总课酬
+        List<Long> oldCourseIdList = Arrays.stream(courseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaryService.getDao().findByCourseSchedules(oldCourseIdList);
+        //获取学员课程价值
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(oldCourseIdList);
+        //保存老师课酬
+        courseScheduleTeacherSalaryService.splitTeacherSalary(courseScheduleTeacherSalaryList,teacherSalaries);
+        //生成老师考勤
+        teacherAttendanceService.addTeacherAttendance(courseScheduleList);
+        //保存学员课程关联
+        courseScheduleStudentPaymentService.splitStudentPayment(courseScheduleStudentPayments,studentPayments);
+        List<Integer> newClassGroupIds = classGroups.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
+        //记录云教练课程
+        List<Long> courseIdList = courseScheduleList.stream().map(e -> e.getId()).collect(Collectors.toList());
+        cloudTeacherFreeCourseService.courseConvert(oldCourseIdList,courseIdList);
+        //记录课程转换相关信息
+        courseConvertLogService.save(courseIds,newClassGroupIds,courseIdList,teacherSalaries,studentPayments);
+        // 刷新群组
+        imUserFriendService.refreshGroupImUserFriend(groupDto.getMusicGroupId(), MUSIC);
+        return BaseController.succeed();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void revoke(Integer courseConvertId) {
+        CourseConvertLog courseConvertLog = courseConvertLogService.get(courseConvertId);
+        //校验是否可以还原
+        this.checkConvertRevoke(courseConvertLog);
+        List<Long> newCourseIdList = Arrays.stream(courseConvertLog.getNewCourseIds().split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<Integer> userIdList = Arrays.stream(courseConvertLog.getStudentIds().split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+        List<CourseSchedule> courseSchedules = JSONArray.parseArray(courseConvertLog.getOldCourseJson(), CourseSchedule.class);
+//        courseScheduleService.getDao().batchUpdateDelFlag(courseConvertLog.getOldCourseIds());
+        courseScheduleService.getDao().batchInsert(courseSchedules);
+
+        String studentMapperJson = courseConvertLog.getOldCourseStudentMapperJson();
+        List<CourseScheduleStudentPayment> studentPayments = JSONArray.parseArray(studentMapperJson, CourseScheduleStudentPayment.class);
+        //获取学员课程价值
+        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(newCourseIdList);
+        //获取现有所有学员列表
+        List<Integer> currentUserIdList = paymentList.stream().map(e -> e.getUserId()).distinct().collect(Collectors.toList());
+        userIdList.removeAll(currentUserIdList);
+        if(!CollectionUtils.isEmpty(userIdList)){
+            studentPayments = studentPayments.stream().filter(e->!userIdList.contains(e.getUserId())).collect(Collectors.toList());
+        }
+        courseScheduleStudentPaymentService.getDao().batchInsert(studentPayments);
+
+        //保存老师课酬
+        String teacherSalaryJson = courseConvertLog.getOldCourseTeacherSalaryJson();
+        courseScheduleTeacherSalaryService.getDao().batchInsert(JSONArray.parseArray(teacherSalaryJson,CourseScheduleTeacherSalary.class));
+        //保存考勤
+        String teacherAttendanceJson = courseConvertLog.getOldTeacherAttendanceJson();
+        teacherAttendanceService.getDao().batchInsert(JSONArray.parseArray(teacherAttendanceJson,TeacherAttendance.class));
+
+        //删除转换后的课程、课酬、学员课程价值
+        this.delByCourse(newCourseIdList);
+        courseConvertLogService.getDao().updateRevoke(courseConvertId);
+    }
+
+    private void delByCourse(List<Long> newCourseIdList){
+        //删除转换后的课程、课酬、学员课程价值
+        courseScheduleService.getDao().batchDelete(newCourseIdList);
+        //删除老师考勤
+        teacherAttendanceService.getDao().batchDeleteByCourseSchedules(newCourseIdList);
+        //删除老师课酬
+        courseScheduleTeacherSalaryService.getDao().batchDeleteByCourseScheduleIds(newCourseIdList);
+        //删除学员课程价值
+        courseScheduleStudentPaymentService.getDao().deleteByCourseSchedule(newCourseIdList);
+        //删除课程成本
+        cloudTeacherFreeCourseService.getDao().deleteByCourseIds(newCourseIdList);
+    }
+
+    private void checkConvertRevoke(CourseConvertLog courseConvertLog) {
+        Optional.ofNullable(courseConvertLog).orElseThrow(()->new BizException("课程转换记录不存在"));
+        if(courseConvertLog.getRevokeFlag()){
+            throw new BizException("课程转换记录已还原");
+        }
+        //原班级是否改动
+        Integer oldClassId = courseConvertLog.getOldClassId();
+        ClassGroup classGroup = classGroupService.getDao().get(oldClassId);
+        if(Objects.isNull(classGroup)){
+            throw new BizException("操作失败:原班级信息不存在");
+        }
+        String studentIds = courseConvertLog.getStudentIds();
+        //学员是否还在班级
+        Integer num = classGroupStudentMapperService.getDao().countByUserIdsAndClassIds(studentIds,oldClassId);
+        if(num != null && num < studentIds.split(",").length){
+            throw new BizException("操作失败:部分学员已退班");
+        }
+        //课程是否有消耗
+        String newCourseIds = courseConvertLog.getNewCourseIds();
+        List<Long> courseIdList = Arrays.stream(newCourseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<CourseSchedule> courseSchedules = courseScheduleService.getDao().findByCourseScheduleIds(courseIdList);
+        if(CollectionUtils.isEmpty(courseSchedules)){
+            throw new BizException("操作失败:没有可转换的课程");
+        }
+        if(courseSchedules.stream().anyMatch(e->e.getStatus() != CourseStatusEnum.NOT_START)){
+            throw new BizException("操作失败:存在已结束课程");
+        }
+        if(courseSchedules.size() < courseIdList.size()){
+            throw new BizException("操作失败:存在被删除的课程");
+        }
+        //学员课表是否变动
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(courseIdList);
+        if(CollectionUtils.isEmpty(studentPayments)){
+            throw new BizException("操作失败:没有可操作的学员");
+        }
+        //课程里面增加学员不允许还原、减少可以
+        long count = studentPayments.stream().map(e -> e.getCreateTime()).distinct().count();
+        if(count > 1){
+            throw new BizException("操作失败:课程学员有变更");
+        }
+    }
+
+    private void checkConvertCourseIds(String courseIds){
+        //是否同一个班级
+        int classNum = courseScheduleConvertDao.countClassNum(courseIds);
+        if(classNum > 1){
+            throw new BizException("操作失败:请选择同一个班级的课程");
+        }
+        //获取合法的课程列表
+        int num = courseScheduleConvertDao.countLegalCourse(courseIds);
+        String[] split = courseIds.split(",");
+        if(num < split.length){
+            throw new BizException("操作失败:所选部分课程不支持课程转换");
+        }
+        //校验学员时长是否一致
+        Integer errorNum = courseScheduleConvertDao.checkStudentCourseNum(courseIds,split.length);
+        if (errorNum != null && errorNum > 0){
+            throw new BizException("操作失败: 课程关联学员不一致");
+        }
+    }
+}

+ 180 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -26,6 +26,7 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 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.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.json.JsonUtil;
 
@@ -38,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -47,14 +49,20 @@ import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MIX;
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
+import static com.ym.mec.biz.dal.enums.ClassGroupTypeEnum.HIGH_ONLINE;
 import static com.ym.mec.biz.dal.enums.GroupType.*;
+import static com.ym.mec.biz.dal.enums.MusicGroupStatusEnum.PROGRESS;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
 import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
@@ -164,6 +172,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private TenantConfigService tenantConfigService;
     @Autowired
 	private VipGroupCategoryDao vipGroupCategoryDao;
+    @Autowired
+	private StudentService studentService;
+    @Autowired
+	private CourseScheduleConvertDao courseScheduleConvertDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -323,7 +335,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 		List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
 
-		courseScheduleDao.batchDeleteCourseSchedulesWithoutCheck(courseScheduleIds);
+		courseScheduleDao.batchDelete(courseScheduleIds);
 		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 		courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
 		// 删除考勤
@@ -4322,20 +4334,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 
     @Override
-    public void studentCoursesScheduleRemind() {
-        List<Mapper> mapperList = courseScheduleDao.queryStudentCoursesTimesOfTomorrow();
-        for (Mapper mapper : mapperList) {
-            Integer userId = Integer.parseInt(mapper.getKey().toString());
-            Integer size = Integer.parseInt(mapper.getValue().toString());
-
-            Map<Integer, String> receivers = new HashMap<Integer, String>();
-            receivers.put(userId, userId + "");
-
-            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HAVE_COURSE_MESSAGE, receivers, null, 0, "2","STUDENT", size);
-        }
-    }
-
-    @Override
     public void studentSignInRemind() {
         List<Mapper> mapperList = courseScheduleDao.queryStudentNotStartCourseScheduleIn90Mins();
         if (mapperList != null && mapperList.size() > 0) {
@@ -5826,4 +5824,171 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto) {
+		Date date = new Date();
+		Integer classGroupId = groupDto.getClassGroupId();
+		String musicGroupId = groupDto.getMusicGroupId();
+		CourseScheduleType type = groupDto.getCourseScheduleType();
+		List<CourseTimeDto> courseTimeDtoList = groupDto.getCourseTimeDtoList();
+		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+		TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+		if (type.equals(CourseScheduleType.HIGH_ONLINE) || type.equals(MUSIC_NETWORK)) {
+			teachMode = TeachModeEnum.ONLINE;
+		}
+		if (CollectionUtils.isEmpty(courseTimeDtoList)) {
+			throw new BizException("排课次数必须大于0");
+		}
+
+		Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
+
+		List<Subject> subjectList = subjectDao.findBySubjectByIdList(groupDto.getSubjectIdList());
+
+		String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
+
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+		//2、获取班级学生
+		List<Integer> studentIds = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).distinct().collect(Collectors.toList());
+
+		//获取可转换课程时长,学员数量,课程数量
+		CourseConvertSumDto courseConvertSumDto = courseScheduleConvertDao.sumCourseConvert(groupDto.getCourseIds());
+
+		//计算每节课的课酬
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+		List<CourseSchedule> courseScheduleList = new ArrayList<>();
+		//校验老师是否冲突
+		courseTimeDtoList.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+		LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
+		//获取排课总时长
+		int totalCourseTimes = 0;
+		long totalCourseDuration = 0;
+		for (CourseTimeDto courseTimeDto : courseTimeDtoList) {
+			//获取排课总次数
+			totalCourseTimes += courseTimeDto.getExpectCourseNum();
+			//获取排课总时长
+			totalCourseDuration += 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();
+		}
+		//校验排课时长
+		if(groupDto.getCheckType() == 0 && totalCourseDuration > courseConvertSumDto.getCourseMinute()){
+			throw new BizException("操作失败:课排课时长不允许超过{}分钟",courseConvertSumDto.getCourseMinute());
+		}
+		//检验排课次数
+		if(groupDto.getCheckType() == 1){
+			int length = groupDto.getCourseIds().split(",").length;
+			if(totalCourseTimes > length){
+				throw new BizException("操作失败:排课次数不允许超过{}次",length);
+			}
+		}
+		//获取节假日
+		Set<String> holidayDays = new HashSet<>();
+		Integer tenantId = TenantContextHolder.getTenantId();
+		String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+		if (StringUtils.isNotBlank(holidaySetting)) {
+			holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
+		}
+		int generateCourseTimes = 0;
+		WhileNode:
+		while (true) {
+			int dayOfWeek = now.getDayOfWeek().getValue();
+			for (CourseTimeDto courseTimeDto : courseTimeDtoList) {
+				List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+				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.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(classGroupId);
+				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(musicGroupId);
+				courseSchedule.setType(groupDto.getCourseScheduleType());
+				courseSchedule.setName(subjectNames + "-" + groupDto.getCourseScheduleType().getMsg());
+				courseSchedule.setGroupType(groupDto.getGroupType());
+				courseSchedule.setTeacherId(teacherId);
+				courseSchedule.setActualTeacherId(teacherId);
+				courseSchedule.setOrganId(musicGroup.getOrganId());
+				courseSchedule.setConvertFlag(groupDto.getConvertFlag());
+				courseScheduleDao.insert(courseSchedule);
+				courseScheduleList.add(courseSchedule);
+				courseScheduleTeacherSalaryService.initMusicGroupCourseTeacherSalary(newClassGroupTeacherMapperList,courseSchedule,
+						musicGroup,courseScheduleTeacherSalaryList);
+			}
+			now = now.plusDays(1);
+		}
+		this.checkNewCourseSchedules(courseScheduleList, false, false);
+		if(!groupDto.getConfirmGenerate()){
+			return BaseController.succeed(courseScheduleList);
+		}
+
+		classGroupService.updateTotalClassTimes(classGroupId, courseScheduleList.size());
+
+		//老师结算表
+		if (!groupDto.getAllowZeroSalary() && courseScheduleTeacherSalaryList.stream().anyMatch(e->e.getExpectSalary().compareTo(BigDecimal.ZERO) == 0)) {
+			return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
+		}
+		groupDto.getCourseScheduleTeacherSalaryList().addAll(courseScheduleTeacherSalaryList);
+		//生成学生结算表
+		groupDto.getCourseScheduleStudentPayments().addAll(courseScheduleStudentPaymentService.init(courseScheduleList,studentIds));
+		return BaseController.succeed(courseScheduleList);
+	}
 }

+ 57 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -18,26 +18,22 @@ import com.ym.mec.common.constant.CommonConstants;
 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.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static java.math.BigDecimal.ROUND_DOWN;
-
 @Service
 public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Long, CourseScheduleStudentPayment>  implements CourseScheduleStudentPaymentService {
 
@@ -77,15 +73,18 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 	@Autowired
 	private StudentPaymentOrderDao studentPaymentOrderDaop;
-	@Autowired
-	private CloudTeacherFreeCourseDao cloudTeacherFreeCourseDao;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
 		return courseScheduleStudentPaymentDao;
 	}
 
-	@Override
+    @Override
+    public CourseScheduleStudentPaymentDao getDao() {
+        return courseScheduleStudentPaymentDao;
+    }
+
+    @Override
 	public int createCourseScheduleStudentPaymentForVipGroup(Long vipGroupId, Integer userId) {
 		VipGroup vipGroup = vipGroupDao.get(vipGroupId);
 
@@ -715,6 +714,55 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	}
 
 	@Override
+	public List<CourseScheduleStudentPayment> init(List<CourseSchedule> courseSchedules,List<Integer> studentIds) {
+		List<CourseScheduleStudentPayment> studentPayments = new ArrayList<>();
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			for (Integer studentId : studentIds) {
+				CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
+				cssp.setGroupType(courseSchedule.getGroupType());
+				cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
+				cssp.setCourseScheduleId(courseSchedule.getId());
+				cssp.setClassGroupId(courseSchedule.getClassGroupId());
+				cssp.setUserId(studentId);
+				cssp.setActualPrice(BigDecimal.ZERO);
+				cssp.setBeMerged(false);
+				studentPayments.add(cssp);
+			}
+		}
+		return studentPayments;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void splitStudentPayment(List<CourseScheduleStudentPayment> courseScheduleStudentPayments,List<CourseScheduleStudentPayment> oldStudentPayments) {
+		Map<Integer, BigDecimal> studentExpectPrice = oldStudentPayments.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getExpectPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+		Map<Integer, BigDecimal> studentOriginalPrice = oldStudentPayments.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+		Map<Integer, List<CourseScheduleStudentPayment>> paymentMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId));
+		for (Integer userId : paymentMap.keySet()) {
+			List<CourseScheduleStudentPayment> studentPayments = paymentMap.get(userId);
+			BigDecimal totalOriginalPrice = studentOriginalPrice.get(userId);
+			BigDecimal totalExpectPrice = studentExpectPrice.get(userId);
+			Integer salarySize = studentPayments.size();
+			BigDecimal subOriginalPrice = totalOriginalPrice;
+			BigDecimal subExpectPrice = totalExpectPrice;
+			BigDecimal ratioOriginal = totalOriginalPrice.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+			BigDecimal ratioExpect = totalExpectPrice.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+			for (int j = 0; j < studentPayments.size(); j++) {
+				CourseScheduleStudentPayment studentPayment = studentPayments.get(j);
+				studentPayment.setExpectPrice(ratioExpect);
+				subExpectPrice = subExpectPrice.subtract(ratioExpect);
+				studentPayment.setOriginalPrice(ratioOriginal);
+				subOriginalPrice = subOriginalPrice.subtract(ratioOriginal);
+				if(j == salarySize - 1){
+					studentPayment.setExpectPrice(studentPayment.getExpectPrice().add(subExpectPrice));
+					studentPayment.setOriginalPrice(studentPayment.getOriginalPrice().add(subOriginalPrice));
+				}
+			}
+		}
+		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+    }
+
+    @Override
 	@Transactional(rollbackFor = Exception.class)
 	public void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType) {
 		studentDao.lockUser(1);

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

@@ -15,6 +15,7 @@ import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.filters.TenantIdThreadLocal;
@@ -33,12 +34,15 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -111,6 +115,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @Override
+    public CourseScheduleTeacherSalaryDao getDao() {
+        return courseScheduleTeacherSalaryDao;
+    }
+
+    @Override
     public void createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
                                                      List<CourseSchedule> vipCourseSchedules,
                                                      BigDecimal offlineTeacherSalary) {
@@ -1256,6 +1265,24 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         courseScheduleTeacherSalary.setExpectSalary(teacherSalaries.get(0).getExpectSalary());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void initMusicGroupCourseTeacherSalary(List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList,
+                       CourseSchedule courseSchedule,MusicGroup musicGroup,List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList){
+        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(courseSchedule.getClassGroupId());
+            courseScheduleTeacherSalary.setEnableChangeSalary(false);
+            this.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+            courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+        }
+    }
+
     /**
      * @describe 创建课程指定教师的课酬记录-乐团课
      * @author Joburgess
@@ -2384,4 +2411,31 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel");
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void splitTeacherSalary(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList,List<CourseScheduleTeacherSalary> oldTeacherSalaries){
+        Map<TeachTypeEnum, BigDecimal> salaryPriceMap = oldTeacherSalaries.stream().
+                collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole,
+                        Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getExpectSalary()).
+                                reduce(BigDecimal.ZERO, BigDecimal::add))));
+        Map<TeachTypeEnum, List<CourseScheduleTeacherSalary>> salaryMap = courseScheduleTeacherSalaryList.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole));
+        for (TeachTypeEnum teachTypeEnum : salaryMap.keySet()) {
+            List<CourseScheduleTeacherSalary> teacherSalaries = salaryMap.get(teachTypeEnum);
+            TeachTypeEnum teacherRole = teacherSalaries.get(0).getTeacherRole();
+            BigDecimal totalSalary = salaryPriceMap.get(teacherRole);
+            Integer salarySize = teacherSalaries.size();
+            BigDecimal subSalary = totalSalary;
+            BigDecimal ratioSalary = totalSalary.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+            for (int j = 0; j < teacherSalaries.size(); j++) {
+                CourseScheduleTeacherSalary salary = teacherSalaries.get(j);
+                salary.setExpectSalary(ratioSalary);
+                subSalary = subSalary.subtract(ratioSalary);
+                if(j == salarySize - 1){
+                    salary.setExpectSalary(salary.getExpectSalary().add(subSalary));
+                }
+            }
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+    }
+
 }

+ 3 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -24,6 +24,8 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 
 @Service
 public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, MusicGroupSubjectPlan> implements MusicGroupSubjectPlanService {
@@ -146,16 +148,13 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
     @Override
     public MusicGroupRegRespDto getMusicGroupRegInfo(String musicGroupId) {
         MusicGroupRegRespDto musicGroupRegResp = new MusicGroupRegRespDto();
-
-        //乐团信息
-        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+        MusicGroup musicGroup = Optional.ofNullable(musicGroupService.get(musicGroupId)).orElseThrow(()->new BizException("乐团信息不存在"));
         musicGroupRegResp.setMusicGroupName(musicGroup.getName());
         musicGroupRegResp.setCourseViewType(musicGroup.getCourseViewType());
         musicGroupRegResp.setMusicGroupStatus(musicGroup.getStatus().getCode());
         //声部信息
         List<Subject> subjectList = subjectService.findSubByMusicGroupId(musicGroupId);
         musicGroupRegResp.setSubjectList(subjectList);
-
         return musicGroupRegResp;
     }
 

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

@@ -158,6 +158,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    public StudentRegistrationDao getDao() {
+        return studentRegistrationDao;
+    }
+
+    @Override
     public PageInfo<StudentApplyDetailDto> queryStudentDetailPage(StudentRegistrationQueryInfo queryInfo) {
         PageInfo<StudentApplyDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

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

@@ -80,7 +80,12 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		return teacherAttendanceDao;
 	}
 
-	@Transactional(rollbackFor = Exception.class)
+    @Override
+    public TeacherAttendanceDao getDao() {
+        return teacherAttendanceDao;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
 	@Override
 	public void saveStudentStandard(List<StudentStandardDto> studentStandardDtos,Long courseScheduleId){
 		if(studentStandardDtos == null || studentStandardDtos.size() == 0){
@@ -994,4 +999,20 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	public void updateDeviceNum(Integer courseId, String userId, String signInDeviceNum, String signOutDeviceNum) {
 		teacherAttendanceDao.updateDeviceNum(courseId,userId,signInDeviceNum,signOutDeviceNum);
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void addTeacherAttendance(List<CourseSchedule> courseScheduleList) {
+		List<TeacherAttendance> teacherAttendanceList = new ArrayList<>();
+		for (CourseSchedule courseSchedule : courseScheduleList) {
+			TeacherAttendance teacherAttendance = new TeacherAttendance();
+			teacherAttendance.setGroupType(courseSchedule.getGroupType());
+			teacherAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+			teacherAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+			teacherAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+			teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+			teacherAttendanceList.add(teacherAttendance);
+		}
+		teacherAttendanceDao.batchInsert(teacherAttendanceList);
+	}
 }

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

@@ -189,7 +189,7 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
             //邮件
             if (StringUtils.isNotBlank(t.getEmail())) {
                 //机构名称 300 余额
-                Object[] emailMsg = {t.getName(), 300, after.toString()};
+                Object[] emailMsg = {t.getName(), balanceThresholdValue, after.toString()};
                 Map<Integer, String> sendPar = new HashMap<>();
                 sendPar.put(t.getUserId(), t.getEmail());
                 log.info("platformSendToAll>>> 余额不足 receiveUserId {} email {} objs {} sendPar {}", t.getUserId(), t.getEmail(), emailMsg, sendPar);

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

@@ -58,8 +58,7 @@
             <if test="subjectIdList!=null">subject_id_list_,</if>
             <if test="name!=null">name_,</if>
             <if test="studentNum!=null">student_num_,</if>
-            <if test="createTime!=null">create_time_,</if>
-            <if test="updateTime!=null">update_time_,</if>
+            create_time_,update_time_,
             <if test="type!=null">type_,</if>
             <if test="expectStudentNum!=null">expect_student_num_,</if>
             <if test="totalClassTimes!=null">total_class_times_,</if>
@@ -77,8 +76,7 @@
             <if test="subjectIdList!=null">#{subjectIdList},</if>
             <if test="name!=null">#{name},</if>
             <if test="studentNum!=null">#{studentNum},</if>
-            <if test="createTime!=null">#{createTime},</if>
-            <if test="updateTime!=null">NOW(),</if>
+            NOW(),NOW(),
             <if test="type!=null">#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},</if>
             <if test="expectStudentNum!=null">#{expectStudentNum},</if>
             <if test="totalClassTimes!=null">#{totalClassTimes},</if>
@@ -1625,4 +1623,12 @@
         WHERE music_group_id_ = #{musicGroupId} AND status_ = 'NORMAL'
         GROUP BY user_id_
     </select>
+    <select id="hasConvertCourse" resultType="java.lang.Boolean">
+        select COUNT(0) from course_schedule cs
+        where cs.class_group_id_ IN
+        <foreach collection="classIdList" separator="," open="(" close=")" item="id">
+            #{id}
+        </foreach>
+        AND cs.convert_flag_ = 1 AND cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND cs.is_lock_ = 0
+    </select>
 </mapper>

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

@@ -113,10 +113,11 @@
 
     <!-- 班级学生批量插入 -->
     <insert id="classGroupStudentsInsert" parameterType="java.util.List">
-        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,tenant_id_)
+        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,update_time_,tenant_id_)
         VALUE
         <foreach collection="classGroupStudentMapperList" item="item" index="index" separator=",">
-            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},#{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{item.tenantId})
+            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},
+            #{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),#{item.tenantId})
         </foreach>
     </insert>
     
@@ -327,7 +328,7 @@
         FROM
             class_group_student_mapper cgsm
             LEFT JOIN course_schedule cs ON cgsm.class_group_id_=cs.class_group_id_
-            WHERE cgsm.user_id_=#{userId}
+            WHERE cgsm.user_id_=#{userId} AND cs.del_flag_ = 0
             AND cs.class_date_ = DATE_FORMAT(#{data},'%Y-%m-%d')
             AND cgsm.status_=#{status}
     </select>
@@ -465,7 +466,7 @@
     <select id="queryNewStudentListByCourseScheduleId" resultMap="ClassGroupStudentMapper">
       	SELECT cgsm.* FROM class_group_student_mapper cgsm LEFT JOIN course_schedule cs ON cgsm.class_group_id_= cs.class_group_id_
 		LEFT JOIN course_schedule_student_payment cssp on cssp.course_schedule_id_ = cs.id_ and cssp.user_id_ = cgsm.user_id_
-		WHERE cssp.id_ IS NULL AND cgsm.status_ != 'QUIT' and cs.id_ = #{courseScheduleId}
+		WHERE cssp.id_ IS NULL AND cgsm.status_ != 'QUIT' and cs.id_ = #{courseScheduleId} AND cs.del_flag_ = 0
     </select>
     <select id="findByGroups" resultMap="ClassGroupStudentMapper">
       SELECT
@@ -690,7 +691,6 @@
     </select>
     
     <select id="queryByClassGroupType" resultMap="ClassGroupStudentMapperDto">
-    
     	SELECT cgsm.*,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 cgsm.class_group_id_ = cgtm.class_group_id_
 		WHERE cgtm.music_group_id_ = #{musicGroupId} and cg.type_ = #{classGroupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} 
@@ -700,6 +700,9 @@
                     #{studentId}
                 </foreach>
         group by cgsm.user_id_
-        
+    </select>
+    <select id="countByUserIdsAndClassIds" resultType="java.lang.Integer">
+        select COUNT(cgsm.id_) from class_group_student_mapper cgsm
+        where FIND_IN_SET(cgsm.user_id_,#{studentIds}) AND cgsm.class_group_id_ = #{oldClassId}
     </select>
 </mapper>

+ 14 - 2
mec-biz/src/main/resources/config/mybatis/CloudTeacherFreeCourseMapper.xml

@@ -58,8 +58,14 @@
 	<delete id="delete" >
 		DELETE FROM cloud_teacher_free_course WHERE id_ = #{id} 
 	</delete>
-	
-	<!-- 分页查询 -->
+    <delete id="deleteByCourseIds">
+		DELETE FROM cloud_teacher_free_course WHERE course_id_ IN
+		<foreach collection="courseIdList" separator="," item="id" open="(" close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+    <!-- 分页查询 -->
 	<select id="queryPage" resultMap="CloudTeacherFreeCourse" parameterType="map">
 		SELECT * FROM cloud_teacher_free_course ORDER BY id_ <include refid="global.limit"/>
 	</select>
@@ -68,4 +74,10 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM cloud_teacher_free_course
 	</select>
+	<select id="countByCourseIdList" resultType="java.lang.Integer">
+		SELECT COUNT(0) FROM cloud_teacher_free_course WHERE course_id_ IN
+		<foreach collection="courseIdList" open="(" close=")" item="id" separator=",">
+			#{id}
+		</foreach>
+	</select>
 </mapper>

+ 100 - 0
mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml

@@ -0,0 +1,100 @@
+<?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.CourseConvertLogDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.CourseConvertLog" id="CourseConvertLog">
+		<result column="id_" property="id" />
+		<result column="student_ids_" property="studentIds" />
+		<result column="old_class_name_" property="oldClassName" />
+		<result column="operator_name_" property="operatorName" />
+		<result column="music_group_id_" property="musicGroupId" />
+		<result column="old_course_ids_" property="oldCourseIds" />
+		<result column="old_class_id_" property="oldClassId" />
+		<result column="old_course_json_" property="oldCourseJson" />
+		<result column="old_course_teacher_salary_json_" property="oldCourseTeacherSalaryJson" />
+		<result column="old_course_student_mapper_json_" property="oldCourseStudentMapperJson" />
+		<result column="old_teacher_attendance_json_" property="oldTeacherAttendanceJson" />
+		<result column="new_course_ids_" property="newCourseIds" />
+		<result column="new_class_ids_" property="newClassIds" />
+		<result column="operator_" property="operator" />
+		<result column="revoke_flag_" property="revokeFlag" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	<select id="get" resultMap="CourseConvertLog">
+		SELECT * FROM course_convert_log WHERE id_ = #{id}
+	</select>
+	<update id="updateRevoke">
+		update course_convert_log set revoke_flag_ = 1,update_time_ = NOW() where id_ = #{courseConvertId}
+	</update>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="CourseConvertLog">
+		SELECT * FROM course_convert_log
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseConvertLog" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO course_convert_log (old_course_ids_,old_class_id_,old_course_json_,old_course_teacher_salary_json_,
+		                                old_course_student_mapper_json_,old_teacher_attendance_json_,new_course_ids_,
+		                                new_class_ids_,operator_,revoke_flag_,create_time_,update_time_,
+		                                music_group_id_,old_class_name_,operator_name_,student_ids_)
+		VALUES(#{oldCourseIds},#{oldClassId},#{oldCourseJson},#{oldCourseTeacherSalaryJson},#{oldCourseStudentMapperJson},
+		       #{oldTeacherAttendanceJson},#{newCourseIds},#{newClassIds},#{operator},#{revokeFlag},
+		       NOW(),NOW(),#{musicGroupId},#{oldClassName},#{operatorName},#{studentIds})
+	</insert>
+
+	<resultMap id="CourseConvertLogDto" type="com.ym.mec.biz.dal.dto.CourseConvertLogDto" extends="CourseConvertLog">
+	</resultMap>
+	<!-- 分页查询 -->
+	<select id="queryConvertPage" resultMap="CourseConvertLogDto" parameterType="map">
+		SELECT ccl.id_,ccl.old_course_ids_,ccl.old_class_id_,ccl.new_course_ids_,ccl.new_class_ids_,ccl.operator_,
+		ccl.revoke_flag_,ccl.create_time_,ccl.update_time_,ccl.music_group_id_,ccl.old_class_name_,ccl.operator_name_,ccl.student_ids_
+		FROM course_convert_log ccl
+		<include refid="queryPageSql"/>
+		<include refid="global.limit"/>
+	</select>
+	<sql id="queryPageSql">
+		<where>
+			<if test="className != null and className != ''">
+				AND ccl.old_class_name_ = #{className}
+			</if>
+			<if test="musicGroupId != null and musicGroupId != ''">
+				AND ccl.music_group_id_ = #{musicGroupId}
+			</if>
+			<if test="operatorName != null and operatorName != ''">
+				AND operator_name_ LIKE CONCAT('%',#{operatorName},'%')
+			</if>
+			<if test="operatorDate != null and operatorDate != ''">
+				AND DATE_FORMAT(ccl.create_time_,'%Y-%m-%d') = #{operatorDate}
+			</if>
+		</where>
+	</sql>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="countConvertPage" resultType="int">
+		SELECT COUNT(ccl.id_) FROM course_convert_log ccl
+		<include refid="queryPageSql"/>
+	</select>
+	<resultMap id="CourseConvertDetailDto" type="com.ym.mec.biz.dal.dto.CourseConvertDetailDto">
+		<result property="courseId" column="courseId"/>
+		<result property="className" column="className"/>
+		<result property="courseName" column="courseName"/>
+		<result property="teacherName" column="teacherName"/>
+		<result property="subjectName" column="subjectName"/>
+		<result property="status" column="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+	</resultMap>
+	<select id="queryCourse" resultMap="CourseConvertDetailDto">
+		select cs.id_ courseId,cg.name_ className,cs.name_ courseName,su.real_name_ teacherName,cs.status_ status,
+			   GROUP_CONCAT(distinct sb.name_) subjectName from
+		(select cs.* from course_convert_log ccl left join course_schedule cs ON FIND_IN_SET(cs.id_,ccl.new_course_ids_) where ccl.id_ = #{courseConvertId}) cs
+		left join class_group cg ON cg.id_ = cs.class_group_id_
+		left join sys_user su ON su.id_ = cs.actual_teacher_id_
+		left join subject sb ON FIND_IN_SET(sb.id_,cg.subject_id_list_)
+		group by cs.id_;
+	</select>
+</mapper>

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

@@ -117,7 +117,7 @@
 		FROM
 			course_schedule cs
 		LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
-		WHERE cs.id_=#{courseScheduleID}
+		WHERE cs.id_=#{courseScheduleID}  AND cs.del_flag_ = 0
 	</select>
 
 </mapper>

+ 44 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleConvert.xml

@@ -0,0 +1,44 @@
+<?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.CourseScheduleConvertDao">
+
+    <select id="countLegalCourse" resultType="java.lang.Integer">
+        SELECT COUNT(cs.id_) FROM course_schedule cs
+        WHERE status_ = 'NOT_START' AND (cs.type_ IN ('SINGLE','TRAINING_SINGLE') OR cs.convert_flag_ = 1)
+        AND cs.is_lock_ = 0 AND cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.new_course_id_ IS NULL
+        AND FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+    <select id="checkStudentCourseNum" resultType="java.lang.Integer">
+        select COUNT(DISTINCT cssp.course_schedule_id_) from course_schedule_student_payment cssp
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})
+        GROUP BY cssp.course_schedule_id_ HAVING COUNT(DISTINCT cssp.user_id_) &lt; (select COUNT(distinct cssp.user_id_) num_
+        from course_schedule_student_payment cssp
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds}));
+    </select>
+    <resultMap id="CourseConvertSumDto" type="com.ym.mec.biz.dal.dto.CourseConvertSumDto">
+        <result property="courseType" column="courseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="courseNum" column="courseNum"/>
+        <result property="studentNum" column="num_"/>
+        <result property="courseMinute" column="minute_"/>
+    </resultMap>
+    <select id="sumCourseConvert" resultMap="CourseConvertSumDto">
+        select COUNT(distinct cs.id_) courseNum,cs.type_ courseType,cssp.num_,SUM(TIMESTAMPDIFF(MINUTE,cs.start_class_time_,cs.end_class_time_)) minute_
+        from course_schedule cs,
+        (select COUNT(distinct cssp.user_id_) num_ from course_schedule_student_payment cssp
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})) cssp
+        where FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+    <select id="queryStudents" resultType="com.ym.mec.biz.dal.dto.BasicUserDto">
+        select cssp.user_id_ userId,su.username_ name,su.phone_ phone from course_schedule_student_payment cssp
+        LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})
+        group by cssp.user_id_
+    </select>
+    <select id="countClassNum" resultType="java.lang.Integer">
+        select COUNT(distinct cs.class_group_id_) from course_schedule cs where FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+</mapper>

+ 30 - 7
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -42,6 +42,7 @@
         <result column="valid_start_time_" property="validStartTime"/>
         <result column="tenant_id_" property="tenantId"/>
         <result column="evaluate_flag_" property="evaluateFlag"/>
+        <result column="convert_flag_" property="convertFlag"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -195,24 +196,24 @@
         INSERT INTO course_schedule
         (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_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
+        schoole_id_,is_lock_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_,convert_flag_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
         #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{subsidy},#{classDate},#{startClassTime},
         #{endClassTime},#{teacherId},#{teacherId},now(),now(),
         #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{name},
         #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{studentNum},#{leaveStudentNum},
-        #{schoolId},#{isLock},#{note},#{teachingContent},#{organId},#{memberFlag},#{preCourseFlag},#{validEndTime},#{validStartTime},#{tenantId})
+        #{schoolId},#{isLock},#{note},#{teachingContent},#{organId},#{memberFlag},#{preCourseFlag},#{validEndTime},#{validStartTime},#{tenantId},#{convertFlag})
     </insert>
 
     <insert id="batchAddCourseSchedules" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO course_schedule
-        (group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
+        (id_,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_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
         VALUE
         <foreach collection="list" item="course" separator=",">
-            (#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},
+            (#{course.id},#{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},
@@ -222,6 +223,24 @@
         </foreach>
     </insert>
 
+    <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
+            keyProperty="id">
+        INSERT INTO course_schedule
+        (id_,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_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
+        VALUE
+        <foreach collection="list" item="course" separator=",">
+            (#{course.id},#{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.actualTeacherId},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},#{course.note},#{course.teachingContent},
+            #{course.organId},#{course.memberFlag},#{course.preCourseFlag},#{course.validEndTime},#{course.validStartTime},#{course.tenantId})
+        </foreach>
+    </insert>
+
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CourseSchedule">
         UPDATE course_schedule
@@ -356,7 +375,7 @@
         </foreach>
     </delete>
 
-    <delete id="batchDeleteCourseSchedulesWithoutCheck">
+    <delete id="batchDelete">
         DELETE FROM course_schedule
         WHERE id_ IN
         <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
@@ -517,6 +536,7 @@
         <foreach collection="courseScheduleIds" item="id" open="(" close=")" separator=",">
             #{id}
         </foreach>
+        AND del_flag_ = 0
         ORDER BY cs.create_time_ DESC
     </select>
 
@@ -1674,13 +1694,13 @@
     <!-- 查找班级未开始的课程 -->
     <select id="findCoursesByClassGroupId" resultMap="CourseSchedule">
         SELECT * FROM course_schedule
-        WHERE class_group_id_ = #{classGroupId} and (new_course_id_ is null or new_course_id_ = 0)
+        WHERE class_group_id_ = #{classGroupId} AND del_flag_ = 0 and (new_course_id_ is null or new_course_id_ = 0)
         <if test="status != null">
             and status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         union all
         select * from course_schedule
-        where class_group_id_ = #{classGroupId} AND pre_course_flag_ = 0 AND id_ = new_course_id_
+        where class_group_id_ = #{classGroupId} AND del_flag_ = 0 AND pre_course_flag_ = 0 AND id_ = new_course_id_
         <if test="status != null">
             and status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
@@ -3184,6 +3204,9 @@
     <update id="markFreeCourse">
         UPDATE course_schedule SET member_flag_ = 1 WHERE FIND_IN_SET(id_,#{courseIds})
     </update>
+    <update id="batchUpdateDelFlag">
+        UPDATE course_schedule SET del_flag_ = 0,update_time_ = NOW() WHERE FIND_IN_SET(id_,#{courseIds})
+    </update>
 
     <select id="getStudentCourseScheduleNum" resultMap="com.ym.mec.biz.dal.dao.PracticeGroupDao.courseGroupExport">
         SELECT COUNT(*) total_class_times_,cssp.user_id_ student_id_

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

@@ -199,7 +199,7 @@
 
     <select id="findByCourseScheduleIds" resultMap="CourseScheduleStudentPayment">
 		SELECT * FROM course_schedule_student_payment WHERE course_schedule_id_ IN
-		<foreach collection="ids" item="id" open="(" close=")" separator=",">
+		<foreach collection="courseIdList" item="id" open="(" close=")" separator=",">
 			#{id}
 		</foreach>
     </select>

+ 4 - 6
mec-biz/src/main/resources/config/mybatis/StudentBasicInfoMapper.xml

@@ -33,12 +33,10 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentBasicInfo" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
-		INSERT INTO student_basic_info (user_id_,user_name_,phone_,subject_id_,subject_name_,grade_,organ_id_,organ_name_,cooperation_organ_id_,cooperation_organ_name_,subject_teacher_id_,subject_teacher_name_) VALUES(#{userId},#{userName},#{phone},#{subjectId},#{subjectName},#{grade},#{organId},#{organName},#{cooperationOrganId},#{cooperationOrganName},#{subjectTeacherId},#{subjectTeacherName})
+		INSERT INTO student_basic_info (user_id_,user_name_,phone_,subject_id_,subject_name_,grade_,organ_id_,
+		                                organ_name_,cooperation_organ_id_,cooperation_organ_name_,subject_teacher_id_,subject_teacher_name_)
+		VALUES(#{userId},#{userName},#{phone},#{subjectId},#{subjectName},#{grade},#{organId},#{organName},#{cooperationOrganId},
+		       #{cooperationOrganName},#{subjectTeacherId},#{subjectTeacherName})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->

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

@@ -73,12 +73,12 @@
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
-        (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
+        (id_,group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
         remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
         sign_out_remark_,update_attendance_type_,url_,sign_in_device_no_,sign_out_device_no_,tenant_id_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
-            (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            (#{teacherAttendance.id},#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.teacherId},#{teacherAttendance.musicGroupId},#{teacherAttendance.classGroupId},
             #{teacherAttendance.courseScheduleId},#{teacherAttendance.signInTime},
             #{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},

+ 2 - 5
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -27,10 +27,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RequestMapping("musicGroup")
@@ -314,7 +311,7 @@ public class MusicGroupController extends BaseController {
     @GetMapping("/getGradeList")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String")})
     public HttpResponseResult<Map<Integer, String>> getGradeList(String musicGroupId) {
-        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+        MusicGroup musicGroup = Optional.ofNullable(musicGroupService.get(musicGroupId)).orElseThrow(()->new BizException("乐团信息不存在"));
         return succeed(organizationService.getGradeList(musicGroup.getOrganId()));
     }
 }

+ 1 - 1
mec-student/src/main/resources/bootstrap-test.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f753d9d9-4bb2-4df6-a483-da9e169617c4
+spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 4 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
@@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 @RequestMapping("teacher")
@@ -63,7 +65,8 @@ public class TeacherController extends BaseController {
     @ApiOperation(value = "根据教师编号查询教师基本信息")
     @GetMapping("/queryUserInfo")
     public Object queryUserInfo() {
-		Teacher teacher = teacherService.get(sysUserService.getUserId());
+		Teacher teacher = Optional.ofNullable(teacherService.get(sysUserService.getUserId())).
+                orElseThrow(()->new BizException("老师信息不存在"));
 		//专业技能
 		if(StringUtils.isNotEmpty(teacher.getSubjectId())){
 			teacher.setSubjectName(subjectDao.findBySubIds(teacher.getSubjectId()));

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

@@ -58,7 +58,7 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "创建班级")
     @PostMapping("/create")
     @PreAuthorize("@pcs.hasPermissions('classGroup/create')")
-    public HttpResponseResult<Boolean> create(@RequestBody ClassGroup classGroup) throws Exception {
+    public HttpResponseResult<Integer> create(@RequestBody ClassGroup classGroup) throws Exception {
         return succeed(classGroupService.create(classGroup));
     }
 

+ 76 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

@@ -0,0 +1,76 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.CourseConvertDetailDto;
+import com.ym.mec.biz.dal.dto.CourseConvertLogDto;
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
+import com.ym.mec.biz.dal.page.ConvertLogQueryInfo;
+import com.ym.mec.biz.service.CourseConvertLogService;
+import com.ym.mec.biz.service.CourseScheduleConvertService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+* @author zx
+* @date 2022/9/21 09:55
+*/
+@RequestMapping("courseScheduleConvert")
+@Api(tags = "课程转换服务")
+@RestController
+public class CourseScheduleConvertController extends BaseController {
+
+    @Autowired
+    private CourseScheduleConvertService courseScheduleConvertService;
+    @Autowired
+    private CourseConvertLogService courseConvertLogService;
+
+    @ApiOperation(value = "获取需要转换的学员列表")
+    @PostMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/queryPage')")
+    public HttpResponseResult<PageInfo<CourseConvertLogDto>> queryPage(@RequestBody ConvertLogQueryInfo queryInfo){
+        return succeed(courseConvertLogService.queryConvertPage(queryInfo));
+    }
+
+    @ApiOperation(value = "获取转换后的课程列表")
+    @GetMapping("/queryCourse")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/queryCourse')")
+    public HttpResponseResult<List<CourseConvertDetailDto>> queryCourse(Integer courseConvertId){
+        return succeed(courseConvertLogService.queryCourse(courseConvertId));
+    }
+
+    @ApiOperation(value = "获取需要转换的学员列表")
+    @GetMapping("/queryStudent")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/queryStudent')")
+    public HttpResponseResult<HashMap<String, Object>> queryStudent(String courseIds){
+        if (StringUtils.isEmpty(courseIds)){
+            throw new BizException("参数校验失败");
+        }
+        return succeed(courseScheduleConvertService.queryConvertStudent(courseIds));
+    }
+
+    @ApiOperation(value = "课程转换")
+    @PostMapping("/action")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/action')")
+    public HttpResponseResult<Boolean> action(@RequestBody List<ClassGroupDto> classGroups){
+        return courseScheduleConvertService.action(classGroups);
+    }
+
+    @ApiOperation(value = "课程转换还原")
+    @GetMapping("/revoke")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/revoke')")
+    public HttpResponseResult revoke(Integer courseConvertId){
+        courseScheduleConvertService.revoke(courseConvertId);
+        return succeed();
+    }
+}
+

+ 0 - 3
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java

@@ -1,7 +1,5 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.CloseMusicGroupDto;
 import com.ym.mec.biz.dal.dto.MusicGroupRegsDto;
 import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
@@ -25,7 +23,6 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 

+ 1 - 1
mec-web/src/main/resources/bootstrap-test.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f753d9d9-4bb2-4df6-a483-da9e169617c4
+spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 1 - 0
mec-web/src/main/resources/columnMapper_修改商品导入.ini

@@ -35,6 +35,7 @@
 
 
 [财务管理导入模板]
+订单类型 = type
 收入类型 = incomeType
 所属分部 = organName
 所属学校 = cooperationOrganName