zouxuan преди 3 години
родител
ревизия
70df2b5270
променени са 25 файла, в които са добавени 742 реда и са изтрити 325 реда
  1. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 5 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java
  4. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java
  5. 150 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  7. 1 20
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  9. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseConvertLogService.java
  10. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  12. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  13. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  14. 1 77
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  15. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  16. 73 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java
  17. 77 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java
  18. 114 187
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  19. 58 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  20. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  21. 48 0
      mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml
  22. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleConvert.xml
  23. 3 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  24. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  25. 7 3
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface CourseConvertLogDao extends BaseDAO<Integer, CourseConvertLog> {
+
+}

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

@@ -1954,4 +1954,6 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     * @date 2022/9/6 14:07
     */
     void markFreeCourse(@Param("courseIds") String courseIds);
+
+    void delByCourseIds(String oldCourseIds);
 }

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

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+
 public class CourseConvertSumDto {
     private Integer courseNum;
 
-    private String courseType;
+    private CourseSchedule.CourseScheduleType courseType;
 
     private Integer studentNum;
 
@@ -17,11 +19,11 @@ public class CourseConvertSumDto {
         this.courseNum = courseNum;
     }
 
-    public String getCourseType() {
+    public CourseSchedule.CourseScheduleType getCourseType() {
         return courseType;
     }
 
-    public void setCourseType(String courseType) {
+    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
         this.courseType = courseType;
     }
 

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

@@ -8,11 +8,21 @@ 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 int convertFlag = 1;
+
+	@ApiModelProperty(value = "排课校验方式:0按总时长,1按课次", required = true)
+	private int checkType = 0;
+
+	@ApiModelProperty(value = "选择的需要转换的课程编号", required = true)
+	private String courseIds;
+
 	@ApiModelProperty(value = "班级编号", required = true)
 	private Integer classGroupId;
 
@@ -60,6 +70,52 @@ public class ClassGroupDto extends BaseEntity {
 	@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 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 int getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(int 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;
 	}

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

@@ -0,0 +1,150 @@
+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 oldCourseIds;
+	
+	/** 转换前班级编号 */
+	@ApiModelProperty(value = "转换前班级编号")
+	private String oldClassIds;
+	
+	@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 String operator;
+
+	@ApiModelProperty(value = "是否还原")
+	private Boolean revokeFlag = false;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	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 String getOldClassIds() {
+		return oldClassIds;
+	}
+
+	public void setOldClassIds(String oldClassIds) {
+		this.oldClassIds = oldClassIds;
+	}
+
+	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 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 int convertFlag = 0;
+
+	public int getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(int convertFlag) {
+		this.convertFlag = convertFlag;
+	}
+
 	public int getEvaluateFlag() {
 		return evaluateFlag;
 	}

+ 1 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -24,8 +24,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 
     Integer create(ClassGroup classGroup);
 
-    void create1(List<ClassGroupDto> classGroups);
-
     /**
      * 查询老师乐团课课程
      *
@@ -297,14 +295,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param classGroup4MixDtos
      * @return
      */
-    HttpResponseResult<ClassGroup> classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
-
-    /**
-     * 排课
-     * @param classGroup4MixDtos
-     * @return
-     */
-    HttpResponseResult<ClassGroup> createCourse(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
+    HttpResponseResult classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;
 
     /**
      * 班级预排课
@@ -351,9 +342,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 
 
 
-    List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId);
-
-
     /**
      * 根据乐团跟声部获取提高班列表
      *
@@ -519,13 +507,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);
 
     /**
      * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额

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

@@ -109,5 +109,5 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
     * @author zx
     * @date 2022/9/23 11:50
     */
-    void addMapper(ClassGroup classGroup, List<String> userIdStrSet);
+    void addMapper(ClassGroup classGroup, List<Integer> userIdStrSet);
 }

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

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.service;
+
+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.common.service.BaseService;
+
+import java.util.List;
+
+public interface CourseConvertLogService extends  BaseService<Integer, CourseConvertLog>{
+
+    void save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+              List<CourseScheduleTeacherSalary> teacherSalaries,
+              List<CourseScheduleStudentPayment> studentPayments);
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseConvertDto;
 import com.ym.mec.biz.dal.entity.ClassGroupDto;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 import java.util.HashMap;
 import java.util.List;
@@ -30,5 +31,5 @@ public interface CourseScheduleConvertService{
     * @author zx
     * @date 2022/9/21 18:01
     */
-    Boolean action(List<ClassGroupDto> classGroups);
+    HttpResponseResult action(List<ClassGroupDto> classGroups);
 }

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

@@ -694,5 +694,5 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	* @author zx
 	* @date 2022/9/23 13:57
 	*/
-	void createCourse(ClassGroupDto groupDto);
+	HttpResponseResult<List<Long>> 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);
+
 }

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

@@ -28,7 +28,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
@@ -298,30 +297,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         return classGroup.getId();
     }
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void create1(List<ClassGroupDto> classGroups) {
-        //校验主教助教是否冲突
-        classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
-        Date date = new Date();
-        for (ClassGroupDto groupDto : classGroups) {
-            List<String> userIdStrSet = new ArrayList<>(Arrays.asList(groupDto.getUserIds().split(",")));
-            groupDto.setStudentNum(userIdStrSet.size());
-            //创建班级
-            ClassGroup classGroup = new ClassGroup();
-            BeanUtils.copyProperties(groupDto,classGroup);
-            this.insert(classGroup);
-            groupDto.setClassGroupId(classGroup.getId());
-            //设置班级上的老师
-            List<Integer> teacherIdList = classGroupTeacherMapperService.addMapper(classGroup);
-            //2、插入班级学生关联关系
-            classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
-            //排课
-            courseScheduleService.createCourse(groupDto);
-        }
-        // 加入IM群组
-        return classGroup.getId();
-    }
 
     @Override
     public List<ClassGroup> findClassGroup4Teacher(Integer teacherId) {
@@ -2387,7 +2362,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<ClassGroup> classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) {
+    public HttpResponseResult classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) {
         Date date = new Date();
         ClassGroup4MixDto classGroup4MixDto1 = classGroup4MixDtos.get(0);
         Integer classGroupId =classGroup4MixDto1.getClassGroupId();
@@ -3536,27 +3511,6 @@ 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 = classGroupTeacherMapperService.getDao().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) {
@@ -4352,36 +4306,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) {
         //获取主班剩余课程时长

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

@@ -650,16 +650,16 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void addMapper(ClassGroup classGroup, List<String> userIdList) {
+    public void addMapper(ClassGroup classGroup, List<Integer> userIdList) {
         if(CollectionUtils.isEmpty(userIdList)){
             return;
         }
         List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
-        for (String userId : userIdList) {
+        for (Integer userId : userIdList) {
             ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
             classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
             classGroupStudentMapper.setClassGroupId(classGroup.getId());
-            classGroupStudentMapper.setUserId(Integer.parseInt(userId));
+            classGroupStudentMapper.setUserId(userId);
             classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
             classGroupStudentMapper.setGroupType(classGroup.getGroupType());
             classGroupStudentList.add(classGroupStudentMapper);
@@ -667,7 +667,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             //原有业务逻辑,用于更新学员注册表班级信息
             StudentRegistration studentRegistration = new StudentRegistration();
             studentRegistration.setClassGroupId(classGroup.getId());
-            studentRegistration.setUserId(Integer.parseInt(userId));
+            studentRegistration.setUserId(userId);
             studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
             studentRegistrationService.getDao().updateByUserIdAndMusicGroupId(studentRegistration);
         }

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

@@ -0,0 +1,73 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.CourseConvertLogService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+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.Arrays;
+import java.util.List;
+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;
+
+	@Override
+	public BaseDAO<Integer, CourseConvertLog> getDAO() {
+		return courseConvertLogDao;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+					 List<CourseScheduleTeacherSalary> teacherSalaries,
+					 List<CourseScheduleStudentPayment> studentPayments) {
+		CourseConvertLog courseConvertLog = new CourseConvertLog();
+		courseConvertLog.setOldCourseIds(oldCourseIds);
+		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);
+		courseConvertLog.setOldClassIds(courseSchedules.stream().map(e->e.getClassGroupId().toString()).distinct().collect(Collectors.joining(",")));
+		courseConvertLog.setOldCourseJson(JSONObject.toJSONString(courseSchedules));
+		//删除课程
+		courseScheduleDao.delByCourseIds(oldCourseIds);
+
+		//记录老师考勤
+		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);
+	}
+}

+ 77 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java

@@ -2,26 +2,26 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.CourseScheduleConvertDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseConvertDto;
 import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupDto;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.CourseScheduleConvertService;
-import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+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.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-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 {
 
@@ -30,6 +30,20 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
     @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;
 
     @Override
@@ -51,12 +65,61 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
     }
 
     @Override
-    public Boolean action(List<ClassGroupDto> classGroups) {
-        //创建班级
-        classGroupService.create1(classGroups);
-        //班级加学员
-        //排课
-        return null;
+    public HttpResponseResult action(List<ClassGroupDto> classGroups) {
+        //校验主教助教是否冲突
+        classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+        int classNum = classGroups.size();
+        //老师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        //学员课程价值
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<Integer> studentIdList = new ArrayList<>();
+        //获取学员课程总价值
+        List<Long> courseIdList = 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(classGroup);
+            //2、插入班级学生关联关系
+            classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
+            //排课
+            groupDto.setCheckType(classNum>1?1:0);
+            HttpResponseResult<List<Long>> result = courseScheduleService.createCourse(groupDto);
+            if(result.getCode() != 200){
+                StringBuffer sb = new StringBuffer("班级");
+                result.setMsg(sb.append(classGroup.getName()).append(":").append(result.getMsg()).toString());
+                return result;
+            }else {
+                courseIdList.addAll(result.getData());
+                courseScheduleTeacherSalaryList.addAll(groupDto.getCourseScheduleTeacherSalaryList());
+                courseScheduleStudentPayments.addAll(groupDto.getCourseScheduleStudentPayments());
+            }
+        }
+        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);
+        //保存学员课程关联
+        courseScheduleStudentPaymentService.splitStudentPayment(courseScheduleStudentPayments,studentPayments);
+        List<Integer> newClassGroupIds = classGroups.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
+        //记录课程转换相关信息
+        courseConvertLogService.save(courseIds,newClassGroupIds,courseIdList,teacherSalaries,studentPayments);
+        int i = 0/0;
+        // 刷新群组
+        imUserFriendService.refreshGroupImUserFriend(groupDto.getMusicGroupId(), MUSIC);
+        return BaseController.succeed();
     }
 
     private void checkConvertCourseIds(String courseIds){

+ 114 - 187
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -170,7 +170,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Autowired
 	private VipGroupCategoryDao vipGroupCategoryDao;
     @Autowired
-	private MusicGroupPaymentCalenderCourseSettingsService musicGroupPaymentCalenderCourseSettingsService;
+	private StudentService studentService;
+    @Autowired
+	private CourseScheduleConvertDao courseScheduleConvertDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -5827,7 +5829,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void createCourse(ClassGroupDto groupDto) {
+	public HttpResponseResult<List<Long>> createCourse(ClassGroupDto groupDto) {
 		Date date = new Date();
 		Integer classGroupId = groupDto.getClassGroupId();
 		String musicGroupId = groupDto.getMusicGroupId();
@@ -5854,215 +5856,140 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		//2、获取班级学生
 		List<Integer> studentIds = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).distinct().collect(Collectors.toList());
 
-		//获取可转换课程时长
-		Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIds);
+		//获取可转换课程时长,学员数量,课程数量
+		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) {
-			//校验老师是否冲突
-			classGroupTeacherMapperService.checkTeachingBishop(courseTimeDto.getClassGroupTeacherMapperList());
-
+			//获取排课总次数
+			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();
 		}
-
-		for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
-			//3、插入班级排课信息
-			LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
-
-			if (!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())) {
-				throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
-			}
-			Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
-			long totalCourseDuration = 0;
-
-			if (classGroup4MixDto.getCourseTimes() <= 0) {
-				throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
-			}
-
-			int totalCourseTimes = 0;
-			int generateCourseTimes = 0;
-			if (!CollectionUtils.isEmpty(classGroup4MixDto.getCourseTimeDtoList())) {
-				totalCourseTimes = classGroup4MixDto.getCourseTimeDtoList().stream().mapToInt(CourseTimeDto::getExpectCourseNum).reduce(0, Integer::sum);
-			}
-
-			Set<String> holidayDays = new HashSet<>();
-			Integer tenantId = TenantContextHolder.getTenantId();
-			String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
-			if (StringUtils.isNotBlank(holidaySetting)) {
-				holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
+		//校验排课时长
+		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<Integer> allTeacherIds = new HashSet<>();
-			List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
-			if (!confirmGenerate) {
-				for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
-					List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
-					Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
-					if (!CollectionUtils.isEmpty(teacherIds)) {
-						allTeacherIds.addAll(teacherIds);
-					}
+		}
+		//获取节假日
+		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 (!CollectionUtils.isEmpty(allTeacherIds)) {
-					allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
+				if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if (Objects.isNull(courseTimeDto.getStartDate()) || Objects.isNull(courseTimeDto.getEndDate())) {
+					throw new BizException("排课循环周期错误,请核查");
 				}
-			}
-
-			WhileNode:
-			while (true) {
-				int dayOfWeek = now.getDayOfWeek().getValue();
-				for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
-					List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
-
-					Set<Integer> noRepeatTeacherIds = newClassGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
-					if (noRepeatTeacherIds.size() != newClassGroupTeacherMapperList.size()) {
-						throw new BizException("主教与助教存在冲突");
-					}
-
-					Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
-					if (Objects.isNull(teacherId)) {
-						throw new BizException("请设置主教");
-					}
-
-					if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
-						throw new BizException("排课循环周期错误,请核查");
-					}
-					if (Objects.isNull(courseTimeDto.getStartDate()) || Objects.isNull(courseTimeDto.getEndDate())) {
-						throw new BizException("排课循环周期错误,请核查");
-					}
 
-					//跳过节假日
-					if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
-						continue;
-					}
+				//跳过节假日
+				if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+					continue;
+				}
 
-					if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
+				if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
 
-					Date classDate = DateConvertor.toDate(now);
+				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;
+				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"));
 					}
-
-					//课时长度
-					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) {
+					if (totalCourseTimes <= generateCourseTimes) {
 						break WhileNode;
 					}
+					continue;
+				}
 
-					String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
-					String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
-
-					CourseSchedule courseSchedule = new CourseSchedule();
-					courseSchedule.setSchoolId(schoolId);
-					courseSchedule.setClassGroupId(classGroup.getId());
-					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
-					courseSchedule.setClassDate(classDate);
-					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
-					if (date.compareTo(courseSchedule.getStartClassTime()) > 0) {
-						throw new BizException("课程开始时间不得早于当前时间");
-					}
-					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
-					courseSchedule.setCreateTime(date);
-					courseSchedule.setUpdateTime(date);
-					courseSchedule.setTeachMode(teachMode);
-					courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
-					courseSchedule.setType(classGroup4MixDto.getCourseType());
-
-					if (classGroup4MixDto.getCourseType().equals(MIX)) {
-						courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
-					} else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
-						courseSchedule.setName(classGroup.getName());
-					} else {
-						courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
-					}
+				//课时长度
+				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();
 
-					courseSchedule.setGroupType(MUSIC);
-					courseSchedule.setTeacherId(teacherId);
-					courseSchedule.setActualTeacherId(teacherId);
-					courseSchedule.setOrganId(musicGroup.getOrganId());
-					courseSchedule.setClassGroupType(classGroup.getType().getCode());
-					courseScheduleDao.insert(courseSchedule);
-					courseScheduleList.add(courseSchedule);
+				totalCourseDuration += classCourseDuration;
 
-					if (!confirmGenerate) {
-						Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
-						SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
-						if (Objects.nonNull(mainTeacher)) {
-							courseSchedule.setActualTeacherName(mainTeacher.getUserName());
-						}
-						List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
-						if (!CollectionUtils.isEmpty(teachingTeachers)) {
-							courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
-						}
-					}
+				courseTimeDto.setCourseNum(courseTimeDto.getCourseNum() + 1);
+				generateCourseTimes += 1;
 
-					for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
-						CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-						courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-						courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-						courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-						courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
-						courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-						courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-						courseScheduleTeacherSalary.setCreateTime(date);
-						courseScheduleTeacherSalary.setUpdateTime(date);
-						courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
-						courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-						if (confirmGenerate && !classGroup4MixDto.getAllowZeroSalary() && BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary()) == 0) {
-							TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-							return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
-						}
-					}
+				if (totalCourseTimes < generateCourseTimes) {
+					break WhileNode;
 				}
 
-				now = now.plusDays(1);
-			}
-
-			if (totalCourseDuration > totalMinutes) {
-				throw new BizException("课程时长不足");
-			}
-		}
-
-		courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
-
-		if (!confirmGenerate) {
-			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-			courseScheduleList.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
-			return BaseController.failed(HttpStatus.PARTIAL_CONTENT, courseScheduleList, "");
-		}
-		classGroupService.updateTotalClassTimes(classGroup.getId(), courseScheduleList.size());
+				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(courseConvertSumDto.getCourseType());
+				courseSchedule.setName(subjectNames + "-" + courseConvertSumDto.getCourseType().getMsg());
+				courseSchedule.setGroupType(MUSIC);
+				courseSchedule.setTeacherId(teacherId);
+				courseSchedule.setActualTeacherId(teacherId);
+				courseSchedule.setOrganId(musicGroup.getOrganId());
+				courseSchedule.setClassGroupType(groupDto.getType().getCode());
+				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);
+
+		classGroupService.updateTotalClassTimes(classGroupId, courseScheduleList.size());
 
 		//老师结算表
-		if (courseScheduleTeacherSalaryList.size() > 0) {
-			courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
-		}
-
-		if (!CollectionUtils.isEmpty(studentList)) {
-			studentService.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
-
-			//学生结算表
-			courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIds);
-		}
-		if (musicGroup.getStatus() == PROGRESS) {
-			imUserFriendService.refreshClassImUserFriend(classGroupId);
+		if (!groupDto.getAllowZeroSalary() && courseScheduleTeacherSalaryList.stream().anyMatch(e->e.getExpectSalary().compareTo(BigDecimal.ZERO) == 0)) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
 		}
-		return BaseController.succeed(classGroup);
+		groupDto.getCourseScheduleTeacherSalaryList().addAll(courseScheduleTeacherSalaryList);
+		//生成学生结算表
+		groupDto.getCourseScheduleStudentPayments().addAll(courseScheduleStudentPaymentService.init(courseScheduleList,studentIds));
+		return BaseController.succeed(courseScheduleList.stream().map(e->e.getId()).collect(Collectors.toList()));
 	}
 }

+ 58 - 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,56 @@ 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 (int i = 0; i < paymentMap.keySet().size(); i++) {
+			List<CourseScheduleStudentPayment> studentPayments = paymentMap.get(i);
+			Integer userId = studentPayments.get(0).getUserId();
+			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(ratioExpect);
+				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);

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

@@ -14,6 +14,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;
@@ -32,12 +33,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;
@@ -110,6 +114,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @Override
+    public CourseScheduleTeacherSalaryDao getDao() {
+        return courseScheduleTeacherSalaryDao;
+    }
+
+    @Override
     public void createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
                                                      List<CourseSchedule> vipCourseSchedules,
                                                      BigDecimal offlineTeacherSalary) {
@@ -1255,6 +1264,23 @@ 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());
+            this.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+            courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+        }
+    }
+
     /**
      * @describe 创建课程指定教师的课酬记录-乐团课
      * @author Joburgess
@@ -2371,4 +2397,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 (int i = 0; i < salaryMap.keySet().size(); i++) {
+            List<CourseScheduleTeacherSalary> teacherSalaries = salaryMap.get(i);
+            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);
+    }
+
 }

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

@@ -0,0 +1,48 @@
+<?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="old_course_ids_" property="oldCourseIds" />
+		<result column="old_class_ids_" property="oldClassIds" />
+		<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="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	
+	<!-- 全查询 -->
+	<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_ids_,old_course_json_,old_course_teacher_salary_json_,
+		                                old_course_student_mapper_json_,old_teacher_attendance_json_,new_course_ids_,new_class_ids_,create_time_,update_time_)
+		VALUES(#{oldCourseIds},#{oldClassIds},#{oldCourseJson},#{oldCourseTeacherSalaryJson},#{oldCourseStudentMapperJson},
+		       #{oldTeacherAttendanceJson},#{newCourseIds},#{newClassIds},NOW(),NOW())
+	</insert>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="CourseConvertLog" parameterType="map">
+		SELECT * FROM course_convert_log <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM course_convert_log
+	</select>
+</mapper>

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

@@ -19,7 +19,7 @@
         and 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"/>
+        <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_"/>

+ 3 - 2
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,13 +196,13 @@
         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"

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

@@ -259,7 +259,7 @@ public class ClassGroupController extends BaseController {
     @PostMapping("/classGroupUpdate")
     @PreAuthorize("@pcs.hasPermissions('classGroup/classGroupUpdate')")
     @ApiImplicitParams({@ApiImplicitParam(name = "ClassGroup4MixDto", value = "添加班级结构", required = true, dataType = "String")})
-    public HttpResponseResult<ClassGroup> classGroupUpdate(@RequestBody List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception {
+    public HttpResponseResult classGroupUpdate(@RequestBody List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception {
         return classGroupService.classGroupUpdate(classGroup4MixDtos);
     }
 

+ 7 - 3
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

@@ -50,10 +50,14 @@ public class CourseScheduleConvertController extends BaseController {
     @GetMapping("/action")
     @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/action')")
     public HttpResponseResult<Boolean> action(@RequestBody List<ClassGroupDto> classGroups){
-        return succeed(courseScheduleConvertService.action(classGroups));
+        return courseScheduleConvertService.action(classGroups);
     }
 
-
-
+    @ApiOperation(value = "课程转换还原")
+    @GetMapping("/revoke")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/revoke')")
+    public HttpResponseResult<Boolean> revoke(@RequestBody List<ClassGroupDto> classGroups){
+        return courseScheduleConvertService.action(classGroups);
+    }
 }