|
@@ -1,5 +1,6 @@
|
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
+import com.ym.mec.auth.api.entity.SysUser;
|
|
|
import com.ym.mec.biz.dal.dao.*;
|
|
|
import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
|
|
|
import com.ym.mec.biz.dal.entity.*;
|
|
@@ -46,6 +47,10 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
|
|
|
private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
|
|
|
@Autowired
|
|
|
private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
|
|
|
+ @Autowired
|
|
|
+ private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
|
|
|
+ @Autowired
|
|
|
+ private TeacherDao teacherDao;
|
|
|
|
|
|
@Override
|
|
|
public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
|
|
@@ -282,103 +287,83 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
|
|
|
public void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds) {
|
|
|
- MusicGroupPaymentCalender musicGroupUnusedFirstPaymentCalender = musicGroupPaymentCalenderDao.getMusicGroupUnusedFirstPaymentCalender(musicGroupId, studentIds);
|
|
|
- if(Objects.isNull(musicGroupUnusedFirstPaymentCalender)){
|
|
|
- throw new BizException("当前乐团暂无新缴费设置");
|
|
|
- }
|
|
|
-
|
|
|
- List<MusicGroupPaymentCalenderDetail> unusedPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.getCalenderDetailWithCalender(musicGroupUnusedFirstPaymentCalender.getId());
|
|
|
- if(CollectionUtils.isEmpty(unusedPaymentCalenderDetail)){
|
|
|
- throw new BizException("当前乐团无学员缴费信息");
|
|
|
- }
|
|
|
- Map<Integer, List<MusicGroupPaymentCalenderDetail>> studentPaymentCalenderMap = unusedPaymentCalenderDetail.stream().collect(Collectors.groupingBy(MusicGroupPaymentCalenderDetail::getUserId));
|
|
|
-
|
|
|
- List<MusicGroupPaymentCalenderCourseSettings> calenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupUnusedFirstPaymentCalender.getId());
|
|
|
- if(CollectionUtils.isEmpty(calenderCourseSettings)){
|
|
|
- throw new BizException("课程收费标准设置异常");
|
|
|
- }
|
|
|
-
|
|
|
- Set<Long> paymentOrderIds = unusedPaymentCalenderDetail.stream().map(MusicGroupPaymentCalenderDetail::getPaymentOrderId).collect(Collectors.toSet());
|
|
|
- List<StudentPaymentOrderDetail> allStudentPaymentOrderDetails = new ArrayList<>();
|
|
|
- if(!CollectionUtils.isEmpty(paymentOrderIds)){
|
|
|
- allStudentPaymentOrderDetails = studentPaymentOrderDetailDao.getWithIds(new ArrayList<>(paymentOrderIds));
|
|
|
- }
|
|
|
- Map<Long, List<StudentPaymentOrderDetail>> orderIdOrderDetailMap = allStudentPaymentOrderDetails.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getPaymentOrderId));
|
|
|
-
|
|
|
- Map<CourseSchedule.CourseScheduleType, MusicGroupPaymentCalenderCourseSettings> courseTypeCourseSettingMap = calenderCourseSettings.stream().collect(Collectors.toMap(MusicGroupPaymentCalenderCourseSettings::getCourseType, cs -> cs, (c1, c2) -> c1));
|
|
|
-
|
|
|
List<CourseScheduleStudentPayment> baseCourseScheduleStudentPayments = new ArrayList<>();
|
|
|
-
|
|
|
+ Map<CourseSchedule.CourseScheduleType, Integer> courseTypeCourseDurationMap = new HashMap<>();
|
|
|
Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCourseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
|
|
|
for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCoursesEntry : typeCourseMap.entrySet()) {
|
|
|
- MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings = courseTypeCourseSettingMap.get(typeCoursesEntry.getKey());
|
|
|
- if(musicGroupPaymentCalenderCourseSettings.getIsStudentOptional()){
|
|
|
- //如果可选,则必须缴费才能排课
|
|
|
- long paymentStudentNum = allStudentPaymentOrderDetails.stream().filter(spd -> musicGroupPaymentCalenderCourseSettings.getCourseType().getCode().equals(spd.getType().getCode())).count();
|
|
|
- if(paymentStudentNum<studentIds.size()){
|
|
|
- throw new BizException("部分学员未完成自选课程缴费");
|
|
|
- }
|
|
|
- }
|
|
|
- List<CourseScheduleStudentPayment> typeCourseStudentPayments = new ArrayList<>();
|
|
|
- BigDecimal typeCourseTotalOriginalPrice = new BigDecimal("0"), typeCourseTotalCurrentPrice = new BigDecimal("0");
|
|
|
- typeCoursesEntry.getValue().sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
|
+ int totalCourseDuration = 0;
|
|
|
for (CourseSchedule courseSchedule : typeCoursesEntry.getValue()) {
|
|
|
- //课程每分钟原价
|
|
|
- BigDecimal unitMinuteOriginalPrice = musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
- //课程每分钟现价
|
|
|
- BigDecimal unitMinuteCurrentPrice = musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
-
|
|
|
//课程时长
|
|
|
int courseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
|
-
|
|
|
- //课程原价
|
|
|
- BigDecimal courseOriginalPrice = unitMinuteOriginalPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
- typeCourseTotalOriginalPrice = typeCourseTotalOriginalPrice.add(courseOriginalPrice);
|
|
|
-
|
|
|
- //课程现价
|
|
|
- BigDecimal courseCurrentPrice = unitMinuteCurrentPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
- typeCourseTotalCurrentPrice = typeCourseTotalCurrentPrice.add(courseCurrentPrice);
|
|
|
-
|
|
|
- CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
|
|
|
- cssp.setGroupType(courseSchedule.getGroupType());
|
|
|
- cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
|
|
|
- cssp.setCourseScheduleId(courseSchedule.getId());
|
|
|
- cssp.setClassGroupId(courseSchedule.getClassGroupId());
|
|
|
- cssp.setBatchNo(musicGroupUnusedFirstPaymentCalender.getBatchNo());
|
|
|
- cssp.setOriginalPrice(courseOriginalPrice);
|
|
|
- cssp.setExpectPrice(courseCurrentPrice);
|
|
|
- cssp.setActualPrice(BigDecimal.ZERO);
|
|
|
- typeCourseStudentPayments.add(cssp);
|
|
|
+ totalCourseDuration += courseDuration;
|
|
|
}
|
|
|
- typeCourseStudentPayments.get(0).setOriginalPrice(typeCourseStudentPayments.get(0).getOriginalPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().subtract(typeCourseTotalOriginalPrice)));
|
|
|
- typeCourseStudentPayments.get(0).setExpectPrice(typeCourseStudentPayments.get(0).getExpectPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().subtract(typeCourseTotalCurrentPrice)));
|
|
|
- baseCourseScheduleStudentPayments.addAll(typeCourseStudentPayments);
|
|
|
+ courseTypeCourseDurationMap.put(typeCoursesEntry.getKey(), totalCourseDuration);
|
|
|
}
|
|
|
|
|
|
- List<MusicGroupPaymentCalenderDetail> needUpdateCalenderDetails = new ArrayList<>();
|
|
|
List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
|
|
|
|
|
|
for (Integer studentId : studentIds) {
|
|
|
- List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetails = studentPaymentCalenderMap.get(studentId);
|
|
|
- if(CollectionUtils.isEmpty(musicGroupPaymentCalenderDetails)){
|
|
|
- throw new BizException("部分学员无缴费信息");
|
|
|
- }
|
|
|
- MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetails.stream().min(Comparator.comparing(MusicGroupPaymentCalenderDetail::getCreateTime)).get();
|
|
|
- if(!musicGroupPaymentCalenderDetail.getMusicGroupPaymentCalenderId().equals(musicGroupUnusedFirstPaymentCalender.getId())){
|
|
|
- throw new BizException("缴费信息异常");
|
|
|
- }
|
|
|
- musicGroupPaymentCalenderDetail.setUseInCourse(1);
|
|
|
- needUpdateCalenderDetails.add(musicGroupPaymentCalenderDetail);
|
|
|
-
|
|
|
- for (CourseScheduleStudentPayment baseCourseScheduleStudentPayment : baseCourseScheduleStudentPayments) {
|
|
|
- CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
|
|
|
- BeanUtils.copyProperties(baseCourseScheduleStudentPayment, cssp);
|
|
|
- cssp.setUserId(studentId);
|
|
|
- courseScheduleStudentPayments.add(cssp);
|
|
|
+ for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
|
|
|
+ //当前课程类型总课程时长
|
|
|
+ Integer typeCourseDuration = courseTypeCourseDurationMap.get(courseScheduleTypeListEntry.getKey());
|
|
|
+ MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(studentId, courseScheduleTypeListEntry.getKey(), typeCourseDuration);
|
|
|
+ if(Objects.isNull(musicGroupPaymentStudentCourseDetail)){
|
|
|
+ SysUser user = teacherDao.getUser(studentId);
|
|
|
+ throw new BizException("{}在{}课程类型上的课程时长不足", user.getUsername(), courseScheduleTypeListEntry.getKey().getMsg());
|
|
|
+ }
|
|
|
+
|
|
|
+ MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentStudentCourseDetail.getMusicGroupPaymentCalenderId());
|
|
|
+ if(Objects.isNull(musicGroupPaymentCalender)){
|
|
|
+ throw new BizException("缴费设置异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalenderAndCourseType(musicGroupPaymentStudentCourseDetail.getMusicGroupPaymentCalenderId(), courseScheduleTypeListEntry.getKey());
|
|
|
+ if(Objects.isNull(musicGroupPaymentCalenderCourseSettings)){
|
|
|
+ throw new BizException("缴费设置异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ //课程每分钟原价
|
|
|
+ BigDecimal unitMinuteOriginalPrice = musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
+ //课程每分钟现价
|
|
|
+ BigDecimal unitMinuteCurrentPrice = musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
+
|
|
|
+ List<CourseScheduleStudentPayment> typeCourseStudentPayments = new ArrayList<>();
|
|
|
+ courseScheduleTypeListEntry.getValue().sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
|
+ BigDecimal typeCourseTotalOriginalPrice = new BigDecimal("0"), typeCourseTotalCurrentPrice = new BigDecimal("0");
|
|
|
+ for (CourseSchedule courseSchedule : courseScheduleTypeListEntry.getValue()) {
|
|
|
+ //课程时长
|
|
|
+ int courseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
|
+
|
|
|
+ //课程原价
|
|
|
+ BigDecimal courseOriginalPrice = unitMinuteOriginalPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
+ typeCourseTotalOriginalPrice = typeCourseTotalOriginalPrice.add(courseOriginalPrice);
|
|
|
+
|
|
|
+ //课程现价
|
|
|
+ BigDecimal courseCurrentPrice = unitMinuteCurrentPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
+ typeCourseTotalCurrentPrice = typeCourseTotalCurrentPrice.add(courseCurrentPrice);
|
|
|
+
|
|
|
+ CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
|
|
|
+ cssp.setGroupType(courseSchedule.getGroupType());
|
|
|
+ cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
|
|
|
+ cssp.setCourseScheduleId(courseSchedule.getId());
|
|
|
+ cssp.setClassGroupId(courseSchedule.getClassGroupId());
|
|
|
+ cssp.setBatchNo(musicGroupPaymentCalender.getBatchNo());
|
|
|
+ cssp.setOriginalPrice(courseOriginalPrice);
|
|
|
+ cssp.setExpectPrice(courseCurrentPrice);
|
|
|
+ cssp.setActualPrice(BigDecimal.ZERO);
|
|
|
+ typeCourseStudentPayments.add(cssp);
|
|
|
+ }
|
|
|
+ if(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().compareTo(typeCourseTotalCurrentPrice)<0){
|
|
|
+ throw new BizException("{}课程类型时长不足", courseScheduleTypeListEntry.getKey().getMsg());
|
|
|
+ }
|
|
|
+ typeCourseStudentPayments.get(0).setOriginalPrice(typeCourseStudentPayments.get(0).getOriginalPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().subtract(typeCourseTotalOriginalPrice)));
|
|
|
+ typeCourseStudentPayments.get(0).setExpectPrice(typeCourseStudentPayments.get(0).getExpectPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().subtract(typeCourseTotalCurrentPrice)));
|
|
|
+ baseCourseScheduleStudentPayments.addAll(typeCourseStudentPayments);
|
|
|
+ musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(typeCourseDuration);
|
|
|
+ musicGroupPaymentStudentCourseDetailDao.update(musicGroupPaymentStudentCourseDetail);
|
|
|
}
|
|
|
}
|
|
|
courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
|
|
|
- musicGroupPaymentCalenderDetailDao.batchUpdate(needUpdateCalenderDetails);
|
|
|
}
|
|
|
|
|
|
@Override
|