|  | @@ -3187,40 +3187,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |          VipGroupCategory vipGroupCategory = vipGroupCategoryService.get(vipGroup.getVipGroupCategoryId().intValue());
 | 
	
		
			
				|  |  |          Map<String, BigDecimal> result = new HashMap<>();
 | 
	
		
			
				|  |  |          Date now = new Date();
 | 
	
		
			
				|  |  | -        BigDecimal bigDecimal;
 | 
	
		
			
				|  |  | -        List<StudentCourseInfoDto> userCourseInfos = new ArrayList<>();
 | 
	
		
			
				|  |  | -        //是否关联活动
 | 
	
		
			
				|  |  | -//        if (vipGroup.getVipGroupActivityId() != null) {
 | 
	
		
			
				|  |  | -//            ActivityUserMapper activityUserMapper = activityUserMapperService.findByStudentId(vipGroupId, studentId);
 | 
	
		
			
				|  |  | -//            if (activityUserMapper != null && !activityUserMapper.getReturnFee()) {
 | 
	
		
			
				|  |  | -//                if (Objects.nonNull(activityUserMapper.getVipGroupId())) {
 | 
	
		
			
				|  |  | -//                    VipGroup group = vipGroupDao.get(vipGroupId);
 | 
	
		
			
				|  |  | -//                    vipGroupCategory = vipGroupCategoryService.get(group.getVipGroupCategoryId().intValue());
 | 
	
		
			
				|  |  | -//                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId(), studentId, null));
 | 
	
		
			
				|  |  | -//                }
 | 
	
		
			
				|  |  | -//                if (Objects.nonNull(activityUserMapper.getGiveVipGroupId())) {
 | 
	
		
			
				|  |  | -//                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getGiveVipGroupId(), studentId, null));
 | 
	
		
			
				|  |  | -//                }
 | 
	
		
			
				|  |  | -//                if (Objects.nonNull(activityUserMapper.getPracticeGroupId())) {
 | 
	
		
			
				|  |  | -//                    vipGroupCategory = vipGroupCategoryService.get(1);
 | 
	
		
			
				|  |  | -//                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getPracticeGroupId(), studentId, null));
 | 
	
		
			
				|  |  | -//                }
 | 
	
		
			
				|  |  | -//                if (Objects.nonNull(activityUserMapper.getGivePracticeGroupId())) {
 | 
	
		
			
				|  |  | -//                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getGivePracticeGroupId(), studentId, null));
 | 
	
		
			
				|  |  | -//                }
 | 
	
		
			
				|  |  | -//                userCourseInfos.removeAll(Collections.singleton(null));
 | 
	
		
			
				|  |  | -//            } else {
 | 
	
		
			
				|  |  | -//                userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.VIP, vipGroupId.toString(), studentId, null);
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//        } else {
 | 
	
		
			
				|  |  | -//            userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.VIP, vipGroupId.toString(), studentId, null);
 | 
	
		
			
				|  |  | -//        }
 | 
	
		
			
				|  |  | +        BigDecimal bigDecimal = ZERO;
 | 
	
		
			
				|  |  | +        List<StudentCourseInfoDto> userCourseInfos  = courseScheduleDao.findUserCourseInfos(GroupType.VIP, vipGroupId.toString(), studentId, null);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (CollectionUtils.isEmpty(userCourseInfos) && vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)) {
 | 
	
		
			
				|  |  |              StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.findByStudentVipGroup(vipGroupId, studentId, DealStatusEnum.SUCCESS.getCode());
 | 
	
		
			
				|  |  | -            if (Objects.isNull(studentPaymentOrder)) {
 | 
	
		
			
				|  |  | -                bigDecimal = ZERO;
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | +            if (Objects.nonNull(studentPaymentOrder)) {
 | 
	
		
			
				|  |  |                  bigDecimal = studentPaymentOrder.getActualAmount().add(studentPaymentOrder.getBalancePaymentAmount());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              result.put("suplusCourseOriginalFee", bigDecimal);
 | 
	
	
		
			
				|  | @@ -3236,24 +3208,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              bigDecimal = allPrice.subtract(historyPrice);
 | 
	
		
			
				|  |  | -            if (bigDecimal.compareTo(ZERO) < 0) {
 | 
	
		
			
				|  |  | -                bigDecimal = ZERO;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (overNum == userCourseInfos.size()) {
 | 
	
		
			
				|  |  | +            if (bigDecimal.compareTo(ZERO) < 0 || overNum == userCourseInfos.size()) {
 | 
	
		
			
				|  |  |                  bigDecimal = ZERO;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              result.put("suplusCourseOriginalFee", allPrice);
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -            bigDecimal = new BigDecimal(0);
 | 
	
		
			
				|  |  |              result.put("suplusCourseOriginalFee", bigDecimal);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
 | 
	
		
			
				|  |  |          if (Objects.isNull(classGroup)) {
 | 
	
		
			
				|  |  |              throw new BizException("未找到对应班级");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (Objects.isNull(bigDecimal)) {
 | 
	
		
			
				|  |  | -            bigDecimal = new BigDecimal(0);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |          bigDecimal = sysUserCashAccountLogService.vipReturnFeeCharges(bigDecimal, vipGroupCategory == null ? 0 : vipGroupCategory.getStudentNum());
 | 
	
		
			
				|  |  |  //		if(vipGroupCategory == null || vipGroupCategory.getStudentNum() <= 1){
 | 
	
		
			
				|  |  |  //            bigDecimal = bigDecimal.multiply(new BigDecimal(0.8)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 | 
	
	
		
			
				|  | @@ -3948,10 +3913,26 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |                  surplusCoursesPrice = surplusCoursesPrice.multiply(discount).setScale(0, BigDecimal.ROUND_CEILING);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            sysUserCashAccountService.subtractFromCourseBalanceAndBalance(studentId, surplusCoursesPrice.setScale(0, BigDecimal.ROUND_CEILING), PlatformCashAccountDetailTypeEnum.PAY_FEE, "后台添加学员金额扣减", vipGroupId);
 | 
	
		
			
				|  |  | +//            sysUserCashAccountService.subtractFromCourseBalanceAndBalance(studentId, surplusCoursesPrice.setScale(0, BigDecimal.ROUND_CEILING), PlatformCashAccountDetailTypeEnum.PAY_FEE, "后台添加学员金额扣减", vipGroupId);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            //获取账户信息
 | 
	
		
			
				|  |  | +            SysUserCashAccount cashAccount = sysUserCashAccountService.getLocked(studentId);
 | 
	
		
			
				|  |  | +            if (cashAccount == null) {
 | 
	
		
			
				|  |  | +                throw new BizException("用户[{}]现金账户不存在", studentId);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            BigDecimal courseBalance = cashAccount.getCourseBalance();
 | 
	
		
			
				|  |  | +            //获取学员排课资格
 | 
	
		
			
				|  |  | +            List studentIdList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            studentIdList.add(studentId);
 | 
	
		
			
				|  |  | +            //获取学员付费排课资格
 | 
	
		
			
				|  |  | +            List<ActivityUserMapper> activityUserMappers = activityUserMapperService.getDao().findByStudents(studentIdList,vipGroup.getVipGroupCategoryId(),vipGroup.getSingleClassMinutes());
 | 
	
		
			
				|  |  | +            //获取学员赠送排课资格
 | 
	
		
			
				|  |  | +            List<ActivityUserMapper> freeActivityUserMappers = activityUserMapperService.getDao().findByStudents1(studentIdList,vipGroup.getVipGroupCategoryId(),vipGroup.getSingleClassMinutes());
 | 
	
		
			
				|  |  | +            int j = 0;
 | 
	
		
			
				|  |  | +            int a = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              //实际支付金额,去除优惠券
 | 
	
		
			
				|  |  |              BigDecimal divide = ZERO;
 | 
	
		
			
				|  |  |              BigDecimal firstAmount = ZERO;
 | 
	
	
		
			
				|  | @@ -3963,11 +3944,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |              for (int i = 0; i < surplusCourses.size(); i++) {
 | 
	
		
			
				|  |  |                  CourseSchedule vipGroupCourseSchedule = surplusCourses.get(i);
 | 
	
		
			
				|  |  |                  CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
 | 
	
		
			
				|  |  | -                courseScheduleStudentPayment.setGroupType(GroupType.VIP);
 | 
	
		
			
				|  |  | -                courseScheduleStudentPayment.setMusicGroupId(vipGroupId.toString());
 | 
	
		
			
				|  |  | -                courseScheduleStudentPayment.setClassGroupId(vipGroupCourseSchedule.getClassGroupId());
 | 
	
		
			
				|  |  | -                courseScheduleStudentPayment.setCourseScheduleId(vipGroupCourseSchedule.getId());
 | 
	
		
			
				|  |  | -                courseScheduleStudentPayment.setUserId(studentId);
 | 
	
		
			
				|  |  |                  if (i == 0) {
 | 
	
		
			
				|  |  |                      courseScheduleStudentPayment.setExpectPrice(firstAmount);
 | 
	
		
			
				|  |  |                      courseScheduleStudentPayment.setActualPrice(firstAmount);
 | 
	
	
		
			
				|  | @@ -3975,6 +3951,19 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |                      courseScheduleStudentPayment.setExpectPrice(divide);
 | 
	
		
			
				|  |  |                      courseScheduleStudentPayment.setActualPrice(divide);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                BigDecimal actualPrice = courseScheduleStudentPayment.getActualPrice();
 | 
	
		
			
				|  |  | +                //按课扣除课程余额
 | 
	
		
			
				|  |  | +                if(courseBalance.compareTo(actualPrice) >= 0){
 | 
	
		
			
				|  |  | +                    courseBalance = courseBalance.subtract(actualPrice);
 | 
	
		
			
				|  |  | +                }else {
 | 
	
		
			
				|  |  | +                    //扣除排课资格
 | 
	
		
			
				|  |  | +                    courseScheduleStudentPayment.setActualPrice(activityUserMapperService.use(activityUserMappers,freeActivityUserMappers,j,a,vipGroup.getId()));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                courseScheduleStudentPayment.setGroupType(GroupType.VIP);
 | 
	
		
			
				|  |  | +                courseScheduleStudentPayment.setMusicGroupId(vipGroupId.toString());
 | 
	
		
			
				|  |  | +                courseScheduleStudentPayment.setClassGroupId(vipGroupCourseSchedule.getClassGroupId());
 | 
	
		
			
				|  |  | +                courseScheduleStudentPayment.setCourseScheduleId(vipGroupCourseSchedule.getId());
 | 
	
		
			
				|  |  | +                courseScheduleStudentPayment.setUserId(studentId);
 | 
	
		
			
				|  |  |                  if (vipGroupCourseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
 | 
	
		
			
				|  |  |                      courseScheduleStudentPayment.setOriginalPrice(vipGroup.getOfflineClassesUnitPrice());
 | 
	
		
			
				|  |  |                  } else if (vipGroupCourseSchedule.getTeachMode().equals(TeachModeEnum.ONLINE)) {
 | 
	
	
		
			
				|  | @@ -3986,6 +3975,15 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 | 
	
		
			
				|  |  |                  courseScheduleStudentPayments.add(courseScheduleStudentPayment);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 | 
	
		
			
				|  |  | +            //扣余额,如果余额不足,那么扣排课资格
 | 
	
		
			
				|  |  | +            if(cashAccount.getCourseBalance().compareTo(courseBalance) != 0){
 | 
	
		
			
				|  |  | +                sysUserCashAccountService.appendCourseBalance(studentId, cashAccount.getCourseBalance().subtract(courseBalance).negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "vip课加学员扣除课程余额");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //更新资格
 | 
	
		
			
				|  |  | +            activityUserMappers.addAll(freeActivityUserMappers);
 | 
	
		
			
				|  |  | +            if(!CollectionUtils.isEmpty(activityUserMappers)){
 | 
	
		
			
				|  |  | +                activityUserMapperService.getDao().batchUpdate(activityUserMappers);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              //创建班级学生关联记录
 | 
	
		
			
				|  |  |              ClassGroupStudentMapper classGroupStudentMapper;
 |