Browse Source

课程转换

zouxuan 2 năm trước cách đây
mục cha
commit
3fa1fa23e5
23 tập tin đã thay đổi với 287 bổ sung41 xóa
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java
  3. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  4. 14 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java
  5. 28 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java
  6. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  7. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  8. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  9. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherFreeCourseService.java
  10. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseConvertLogService.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  13. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  14. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  15. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherFreeCourseServiceImpl.java
  16. 15 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java
  17. 137 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java
  18. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  19. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  20. 4 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  21. 11 7
      mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml
  22. 5 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  23. 5 7
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

+ 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);
+
+    List<Integer> findByUserIdsAndClassIds(@Param("studentIds") String studentIds, @Param("oldClassIds") String oldClassIds);
 }

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

@@ -5,4 +5,6 @@ import com.ym.mec.common.dal.BaseDAO;
 
 public interface CourseConvertLogDao extends BaseDAO<Integer, CourseConvertLog> {
 
+
+    void updateRevoke(Integer courseConvertId);
 }

+ 3 - 2
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);
 
     /**
      * 删除学生对应的课程
@@ -618,4 +618,5 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      */
     List<StudentOrganDto> queryRemainCourseStudent(@Param("organIds") List<Integer> organIds);
 
+    Integer countByCourseIdAndUserId(@Param("newCourseIds") String newCourseIds, @Param("studentIds") String studentIds);
 }

+ 14 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java

@@ -14,8 +14,11 @@ import java.util.Map;
 
 public class ClassGroupDto extends BaseEntity {
 
+	@ApiModelProperty(value = "是否确认生成课程", required = true)
+	private Boolean confirmGenerate = false;
+
 	@ApiModelProperty(value = "是否转换课", required = true)
-	private int convertFlag = 1;
+	private Boolean convertFlag = true;
 
 	@ApiModelProperty(value = "排课校验方式:0按总时长,1按课次", required = true)
 	private int checkType = 0;
@@ -76,6 +79,14 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "学员课程关联", required = true)
 	List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
 
+	public Boolean getConfirmGenerate() {
+		return confirmGenerate;
+	}
+
+	public void setConfirmGenerate(Boolean confirmGenerate) {
+		this.confirmGenerate = confirmGenerate;
+	}
+
 	public List<CourseScheduleStudentPayment> getCourseScheduleStudentPayments() {
 		return courseScheduleStudentPayments;
 	}
@@ -92,11 +103,11 @@ public class ClassGroupDto extends BaseEntity {
 		this.courseScheduleTeacherSalaryList = courseScheduleTeacherSalaryList;
 	}
 
-	public int getConvertFlag() {
+	public Boolean getConvertFlag() {
 		return convertFlag;
 	}
 
-	public void setConvertFlag(int convertFlag) {
+	public void setConvertFlag(Boolean convertFlag) {
 		this.convertFlag = convertFlag;
 	}
 

+ 28 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java

@@ -12,6 +12,9 @@ public class CourseConvertLog {
 
 	private Integer id;
 	
+	@ApiModelProperty(value = "学员编号列表")
+	private String studentIds;
+
 	/** 转换前课程编号 */
 	@ApiModelProperty(value = "转换前课程编号")
 	private String oldCourseIds;
@@ -43,7 +46,7 @@ public class CourseConvertLog {
 
 	/** 转换后的班级编号 */
 	@ApiModelProperty(value = "操作人")
-	private String operator;
+	private Integer operator;
 
 	@ApiModelProperty(value = "是否还原")
 	private Boolean revokeFlag = false;
@@ -54,6 +57,14 @@ public class CourseConvertLog {
 	/**  */
 	private java.util.Date updateTime;
 
+	public String getStudentIds() {
+		return studentIds;
+	}
+
+	public void setStudentIds(String studentIds) {
+		this.studentIds = studentIds;
+	}
+
 	public Integer getId() {
 		return id;
 	}
@@ -126,6 +137,22 @@ public class CourseConvertLog {
 		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;
 	}

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

@@ -202,13 +202,13 @@ public class CourseSchedule  extends BaseEntity{
 	private int evaluateFlag = 0;
 
 	//当前课程是否是转换课
-	private int convertFlag = 0;
+	private Boolean convertFlag = false;
 
-	public int getConvertFlag() {
+	public Boolean getConvertFlag() {
 		return convertFlag;
 	}
 
-	public void setConvertFlag(int convertFlag) {
+	public void setConvertFlag(Boolean convertFlag) {
 		this.convertFlag = convertFlag;
 	}
 

+ 3 - 0
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,6 +20,8 @@ import java.util.List;
 import java.util.Map;
 
 public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
+
+    ClassGroupDao getDao();
 	
 	PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
 

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

@@ -1,5 +1,6 @@
 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;
@@ -16,6 +17,8 @@ import java.util.Set;
 
 public interface ClassGroupStudentMapperService extends BaseService<Long, ClassGroupStudentMapper> {
 
+    ClassGroupStudentMapperDao getDao();
+
     /**
      * 查找班级学生对应关系
      * @param userId

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

@@ -12,4 +12,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);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CourseConvertLogDao;
 import com.ym.mec.biz.dal.entity.CourseConvertLog;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
@@ -8,8 +9,10 @@ import com.ym.mec.common.service.BaseService;
 import java.util.List;
 
 public interface CourseConvertLogService extends  BaseService<Integer, CourseConvertLog>{
+    CourseConvertLogDao getDao();
 
-    void save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+    CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
               List<CourseScheduleTeacherSalary> teacherSalaries,
               List<CourseScheduleStudentPayment> studentPayments);
+
 }

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

@@ -32,4 +32,13 @@ public interface CourseScheduleConvertService{
     * @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);
 }

+ 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
 	*/
-	HttpResponseResult<List<Long>> createCourse(ClassGroupDto groupDto);
+	HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto);
 }

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

@@ -162,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>();

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

@@ -69,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);
     }

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

@@ -1,8 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.CloudTeacherFreeCourseDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.OperatingReportCloudDao;
 import com.ym.mec.biz.dal.entity.CloudTeacherFreeCourse;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.service.CloudTeacherFreeCourseService;
+import com.ym.mec.biz.service.OperatingReportCloudService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
@@ -17,6 +21,8 @@ public class CloudTeacherFreeCourseServiceImpl extends BaseServiceImpl<Long, Clo
 	
 	@Autowired
 	private CloudTeacherFreeCourseDao cloudTeacherFreeCourseDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
 
 	@Override
 	public BaseDAO<Long, CloudTeacherFreeCourse> getDAO() {
@@ -33,4 +39,14 @@ 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) {
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(oldCourseIdList);
+		boolean convertFlag = courseSchedules.get(0).getConvertFlag();
+		if(convertFlag){
+			cloudTeacherFreeCourseDao.batchInsert(StringUtils.join(courseIdList,","),null);
+		}
+    }
 }

+ 15 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java

@@ -4,6 +4,7 @@ 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.biz.service.SysUserService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
@@ -28,19 +29,30 @@ public class CourseConvertLogServiceImpl extends BaseServiceImpl<Integer, Course
 	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 	@Autowired
 	private TeacherAttendanceDao teacherAttendanceDao;
+	@Autowired
+	private SysUserService sysUserService;
 
 	@Override
 	public BaseDAO<Integer, CourseConvertLog> getDAO() {
 		return courseConvertLogDao;
 	}
 
-    @Override
+	@Override
+	public CourseConvertLogDao getDao() {
+		return courseConvertLogDao;
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
-    public void save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+    public CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
 					 List<CourseScheduleTeacherSalary> teacherSalaries,
 					 List<CourseScheduleStudentPayment> studentPayments) {
+		Integer userId = sysUserService.getUserId();
 		CourseConvertLog courseConvertLog = new CourseConvertLog();
+		courseConvertLog.setOperator(userId);
 		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
@@ -69,5 +81,6 @@ public class CourseConvertLogServiceImpl extends BaseServiceImpl<Integer, Course
 		courseConvertLog.setNewCourseIds(StringUtils.join(courseIdList,","));
 		courseConvertLog.setNewClassIds(StringUtils.join(newClassGroupIds,","));
 		courseConvertLogDao.insert(courseConvertLog);
+		return courseConvertLog;
 	}
 }

+ 137 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java

@@ -1,13 +1,14 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.CourseScheduleConvertDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 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.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+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;
@@ -15,8 +16,13 @@ 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.jdbc.support.lob.LobCreator;
 import org.springframework.stereotype.Service;
+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.stream.Collectors;
 
@@ -45,6 +51,10 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
     private ImUserFriendService imUserFriendService;
     @Autowired
     private ClassGroupService classGroupService;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
+    @Autowired
+    private CloudTeacherFreeCourseService cloudTeacherFreeCourseService;
 
     @Override
     public HashMap<String, Object> queryConvertStudent(String courseIds) {
@@ -66,6 +76,8 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
 
     @Override
     public HttpResponseResult action(List<ClassGroupDto> classGroups) {
+        //校验课程是否可以进行转换
+        this.checkConvertCourseIds(classGroups.get(0).getCourseIds());
         //校验主教助教是否冲突
         classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
         int classNum = classGroups.size();
@@ -91,15 +103,19 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
             classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
             //排课
             groupDto.setCheckType(classNum>1?1:0);
-            HttpResponseResult<List<Long>> result = courseScheduleService.createCourse(groupDto);
+            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());
                 return result;
             }else {
-                courseIdList.addAll(result.getData());
-                courseScheduleTeacherSalaryList.addAll(groupDto.getCourseScheduleTeacherSalaryList());
-                courseScheduleStudentPayments.addAll(groupDto.getCourseScheduleStudentPayments());
+                if(groupDto.getConfirmGenerate()){
+                    courseIdList.addAll(result.getData().stream().map(e->e.getId()).collect(Collectors.toList()));
+                    courseScheduleTeacherSalaryList.addAll(groupDto.getCourseScheduleTeacherSalaryList());
+                    courseScheduleStudentPayments.addAll(groupDto.getCourseScheduleStudentPayments());
+                }else {
+                    return result;
+                }
             }
         }
         ClassGroupDto groupDto = classGroups.get(0);
@@ -116,12 +132,124 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
         List<Integer> newClassGroupIds = classGroups.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
         //记录课程转换相关信息
         courseConvertLogService.save(courseIds,newClassGroupIds,courseIdList,teacherSalaries,studentPayments);
+        //记录云教练课程
+        cloudTeacherFreeCourseService.courseConvert(oldCourseIdList,courseIdList);
         int i = 0/0;
         // 刷新群组
         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().batchAddCourseSchedules(courseSchedules);
+        Map<Long, CourseSchedule> courseMap = courseSchedules.stream().collect(Collectors.groupingBy(e -> e.getId(),Collectors.collectingAndThen(Collectors.toList(),v->v.get(0))));
+
+        String studentMapperJson = courseConvertLog.getOldCourseStudentMapperJson();
+        List<CourseScheduleStudentPayment> studentPayments = JSONArray.parseArray(studentMapperJson, CourseScheduleStudentPayment.class);
+
+        courseScheduleStudentPaymentService.getDao().batchInsert(studentPayments);
+        //获取学员课程价值
+        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(newCourseIdList);
+        //获取现有所有学员列表
+        Map<Integer, BigDecimal> userExpectMap = paymentList.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId,
+                Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getExpectPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+        Map<Integer, BigDecimal> userOriginalMap = paymentList.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId,
+                Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+        CourseScheduleStudentPayment payment = paymentList.get(0);
+        //生成新的courseScheduleStudentPayment
+        List<Long> oldCourseIdList = Arrays.stream(courseConvertLog.getOldCourseIds().split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+
+        for (Integer userId : userExpectMap.keySet()) {
+            BigDecimal expectAmount = userExpectMap.get(userId);
+            BigDecimal originalAmount = userOriginalMap.get(userId);
+            BigDecimal subExpectAmount = expectAmount;
+            BigDecimal subOriginalAmount = originalAmount;
+            int courseSize = oldCourseIdList.size();
+            BigDecimal ratioExpect = expectAmount.divide(new BigDecimal(courseSize), 2, RoundingMode.HALF_UP);
+            BigDecimal ratioOriginal = subOriginalAmount.divide(new BigDecimal(courseSize), 2, RoundingMode.HALF_UP);
+            for (int i = 0; i < courseSize; i++) {
+                CourseSchedule courseSchedule = courseMap.get(oldCourseIdList.get(i));
+                CourseScheduleStudentPayment studentPayment = new CourseScheduleStudentPayment();
+                studentPayment.setCourseScheduleId(courseSchedule.getId());
+                studentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+                studentPayment.setUserId(userId);
+                studentPayment.setOriginalPrice(ratioOriginal);
+                studentPayment.setExpectPrice(ratioExpect);
+                subExpectAmount = subExpectAmount.subtract(ratioExpect);
+                subOriginalAmount = subOriginalAmount.subtract(ratioOriginal);
+                if(i == courseSize - 1){
+                    studentPayment.setOriginalPrice(studentPayment.getOriginalPrice().add(subOriginalAmount));
+                    studentPayment.setExpectPrice(studentPayment.getExpectPrice().add(subExpectAmount));
+                }
+                studentPayment.setActualPrice(BigDecimal.ZERO);
+                studentPayment.setTenantId(courseSchedule.getTenantId());
+                studentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+            }
+        }
+
+
+
+        String teacherSalaryJson = courseConvertLog.getOldCourseTeacherSalaryJson();
+        courseScheduleTeacherSalaryService.getDao().batchInsert(JSONArray.parseArray(teacherSalaryJson,CourseScheduleTeacherSalary.class));
+        String teacherAttendanceJson = courseConvertLog.getOldTeacherAttendanceJson();
+        teacherAttendanceDao.batchInsert(JSONArray.parseArray(teacherAttendanceJson,TeacherAttendance.class));
+
+        //删除转换后的课程、课酬、学员课程价值
+        this.delByCourse(newCourseIdList);
+        courseConvertLogService.getDao().updateRevoke(courseConvertId);
+    }
+
+    private void delByCourse(List<Long> newCourseIdList){
+        //删除转换后的课程、课酬、学员课程价值
+        courseScheduleService.getDao().batchDeleteCourseSchedulesWithoutCheck(newCourseIdList);
+        //删除老师考勤
+        teacherAttendanceDao.batchDeleteByCourseSchedules(newCourseIdList);
+        //删除老师课酬
+        courseScheduleTeacherSalaryService.getDao().batchDeleteByCourseScheduleIds(newCourseIdList);
+        //删除学员课程价值
+        courseScheduleStudentPaymentService.getDao().deleteByCourseSchedule(newCourseIdList);
+    }
+
+    private void checkConvertRevoke(CourseConvertLog courseConvertLog) {
+        Optional.ofNullable(courseConvertLog).orElseThrow(()->new BizException("课程转换记录不存在"));
+        if(courseConvertLog.getRevokeFlag()){
+            throw new BizException("课程转换记录已还原");
+        }
+        //原班级是否改动
+        String oldClassIds = courseConvertLog.getOldClassIds();
+        List<Integer> oldClassIdList = Arrays.stream(oldClassIds.split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+        List<ClassGroup> classGroupList = classGroupService.getDao().findByClassGroupIds(oldClassIdList, null);
+        if(CollectionUtils.isEmpty(classGroupList) || classGroupList.size() < oldClassIdList.size()){
+            throw new BizException("操作失败:原班级信息有改动");
+        }
+        //学员是否还在班级
+        List<Integer> classGroupIds = classGroupStudentMapperService.getDao().findByUserIdsAndClassIds(courseConvertLog.getStudentIds(),oldClassIds);
+        if(CollectionUtils.isEmpty(classGroupIds) || classGroupIds.size() < oldClassIdList.size()){
+            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(courseSchedules.stream().anyMatch(e->e.getStatus() == CourseStatusEnum.OVER)){
+            throw new BizException("操作失败:有已结束课程");
+        }
+        String studentIds = courseConvertLog.getStudentIds();
+        //学员课表是否变动
+        Integer userNum = courseScheduleStudentPaymentService.getDao().countByCourseIdAndUserId(newCourseIds,studentIds);
+        if(userNum == null || userNum < studentIds.split(",").length){
+            throw new BizException("操作失败:课程学员有变更");
+        }
+    }
+
     private void checkConvertCourseIds(String courseIds){
         //是否同一个班级
         int classNum = courseScheduleConvertDao.countClassNum(courseIds);
@@ -132,7 +260,7 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
         int num = courseScheduleConvertDao.countLegalCourse(courseIds);
         String[] split = courseIds.split(",");
         if(num < split.length){
-            throw new BizException("操作失败:所选课程不支持课程转换");
+            throw new BizException("操作失败:所选部分课程不支持课程转换");
         }
         //校验学员时长是否一致
         int errorNum = courseScheduleConvertDao.checkStudentCourseNum(courseIds,split.length);

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

@@ -5839,7 +5839,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public HttpResponseResult<List<Long>> createCourse(ClassGroupDto groupDto) {
+	public HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto) {
 		Date date = new Date();
 		Integer classGroupId = groupDto.getClassGroupId();
 		String musicGroupId = groupDto.getMusicGroupId();
@@ -6000,6 +6000,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		groupDto.getCourseScheduleTeacherSalaryList().addAll(courseScheduleTeacherSalaryList);
 		//生成学生结算表
 		groupDto.getCourseScheduleStudentPayments().addAll(courseScheduleStudentPaymentService.init(courseScheduleList,studentIds));
-		return BaseController.succeed(courseScheduleList.stream().map(e->e.getId()).collect(Collectors.toList()));
+		return BaseController.succeed(courseScheduleList);
 	}
 }

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

@@ -1277,6 +1277,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
             courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
             courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            courseScheduleTeacherSalary.setEnableChangeSalary(false);
             this.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
             courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
         }

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

@@ -691,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} 
@@ -701,6 +700,9 @@
                     #{studentId}
                 </foreach>
         group by cgsm.user_id_
-        
+    </select>
+    <select id="findByUserIdsAndClassIds" resultType="java.lang.Integer">
+        select distinct class_group_id_ from class_group_student_mapper cgsm
+        where FIND_IN_SET(cgsm.user_id_,#{studentIds}) AND FIND_IN_SET(cgsm.user_id_,#{oldClassIds})
     </select>
 </mapper>

+ 11 - 7
mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml

@@ -16,11 +16,16 @@
 		<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>
-	
-	
+	<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
@@ -29,13 +34,12 @@
 	<!-- 向数据库增加一条记录 -->
 	<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_)
+		                                old_course_student_mapper_json_,old_teacher_attendance_json_,new_course_ids_,
+		                                new_class_ids_,operator_,revoke_flag_,create_time_,update_time_)
 		VALUES(#{oldCourseIds},#{oldClassIds},#{oldCourseJson},#{oldCourseTeacherSalaryJson},#{oldCourseStudentMapperJson},
-		       #{oldTeacherAttendanceJson},#{newCourseIds},#{newClassIds},NOW(),NOW())
+		       #{oldTeacherAttendanceJson},#{newCourseIds},#{newClassIds},#{operator},#{revokeFlag},NOW(),NOW())
 	</insert>
-	
-	
-	
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="CourseConvertLog" parameterType="map">
 		SELECT * FROM course_convert_log <include refid="global.limit"/>

+ 5 - 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>
@@ -1094,4 +1094,8 @@
         </foreach>
         group by cssp.user_id_ , u.organ_id_
 	</select>
+    <select id="countByCourseIdAndUserId" resultType="java.lang.Integer">
+		select COUNT(distinct user_id_) from course_schedule_student_payment cssp
+		where FIND_IN_SET(cssp.user_id_,#{studentIds}) and FIND_IN_SET(cssp.course_schedule_id_,#{newCourseIds})
+	</select>
 </mapper>

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

@@ -16,10 +16,7 @@ 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.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
 import java.util.List;
@@ -47,7 +44,7 @@ public class CourseScheduleConvertController extends BaseController {
     }
 
     @ApiOperation(value = "课程转换")
-    @GetMapping("/action")
+    @PostMapping("/action")
     @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/action')")
     public HttpResponseResult<Boolean> action(@RequestBody List<ClassGroupDto> classGroups){
         return courseScheduleConvertService.action(classGroups);
@@ -56,8 +53,9 @@ public class CourseScheduleConvertController extends BaseController {
     @ApiOperation(value = "课程转换还原")
     @GetMapping("/revoke")
     @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/revoke')")
-    public HttpResponseResult<Boolean> revoke(@RequestBody List<ClassGroupDto> classGroups){
-        return courseScheduleConvertService.action(classGroups);
+    public HttpResponseResult revoke(Integer courseConvertId){
+        courseScheduleConvertService.revoke(courseConvertId);
+        return succeed();
     }
 }