|
@@ -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);
|