|  | @@ -1,4 +1,6 @@
 | 
	
		
			
				|  |  |  package com.yonge.cooleshow.biz.dal.service.impl;
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.util.Date;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
	
	
		
			
				|  | @@ -12,11 +14,15 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.entity.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.support.PageUtil;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.vo.*;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.common.constant.SysConfigConstant;
 | 
	
	
		
			
				|  | @@ -32,6 +38,7 @@ import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | +import rx.subjects.Subject;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.time.LocalDate;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
	
		
			
				|  | @@ -258,6 +265,22 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  | +     * 批量检查学生课时在数据库是否重复
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param studentId 老师id
 | 
	
		
			
				|  |  | +     * @param timeList  时间集合
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private <T> void batchCheckStudentCourseTime(Long studentId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
 | 
	
		
			
				|  |  | +        //再校验数据库中课程时间和传入时间是否有交集
 | 
	
		
			
				|  |  | +        timeList.forEach(o -> {
 | 
	
		
			
				|  |  | +            boolean checkDataTime = courseScheduleService.checkStudentCourseTime(studentId, startTimeFun.apply(o), endTimeFun.apply(o));
 | 
	
		
			
				|  |  | +            if (checkDataTime) {
 | 
	
		
			
				|  |  | +                throw new BizException("预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  |       * 自动排课
 | 
	
		
			
				|  |  |       * <p>自动排课规则及场景:总5节课,填入2节,需要自动补3节
 | 
	
		
			
				|  |  |       * <p>1.把前面2节课的时间循环+1周直到填满5节课为止
 | 
	
	
		
			
				|  | @@ -420,6 +443,109 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 | 
	
		
			
				|  |  |          return redissonClient.getMap(key);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public IPage<LiveCourseGroupVo> selectAdminLivePage(IPage<LiveCourseGroupVo> page, LiveCourseGroupSearch query) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        IPage<LiveCourseGroupVo> liveCourseGroupVoIPage = baseMapper.selectAdminLivePage(page, query);
 | 
	
		
			
				|  |  | +        List<LiveCourseGroupVo> records = liveCourseGroupVoIPage.getRecords();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(records)) {
 | 
	
		
			
				|  |  | +            return liveCourseGroupVoIPage;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<Long> courseGroupIdList = records.stream()
 | 
	
		
			
				|  |  | +                                              .map(LiveCourseGroupVo::getCourseGroupId)
 | 
	
		
			
				|  |  | +                                              .collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 获取课程组声部
 | 
	
		
			
				|  |  | +        List<LiveCourseGroupVo> subjectList = baseMapper.selectCourseGroupSubject(courseGroupIdList);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < records.size(); i++) {
 | 
	
		
			
				|  |  | +            records.get(i).setSubjectName(subjectList.get(i).getSubjectName());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return liveCourseGroupVoIPage;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public IPage<LiveCourseGroupStudentVo> selectAdminLiveStudentPage(IPage<LiveCourseGroupStudentVo> page,
 | 
	
		
			
				|  |  | +                                                                      LiveCourseGroupStudentSearch query) {
 | 
	
		
			
				|  |  | +        return baseMapper.selectAdminLiveStudentPage(page, query);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public List<LiveCourseGroupPlanVo> selectAdminLivePlan(Long courseGroupId) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return baseMapper.selectAdminLivePlan(courseGroupId);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 学生购买直播课程组
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param param 传入参数
 | 
	
		
			
				|  |  | +     *              <p> - groupId    直播课程组id
 | 
	
		
			
				|  |  | +     *              <p> - studentId    学员id
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void buyLiveCourse(Map<String, Object> param) {
 | 
	
		
			
				|  |  | +        Long studentId = WrapperUtil.toLong(param, "studentId", "学员id不能为空!");
 | 
	
		
			
				|  |  | +        Long groupId = WrapperUtil.toLong(param, "groupId", "课程组id不能为空!");
 | 
	
		
			
				|  |  | +        //学生信息
 | 
	
		
			
				|  |  | +        getSysUser(studentId);
 | 
	
		
			
				|  |  | +        //课程组信息
 | 
	
		
			
				|  |  | +        CourseGroup liveCourseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
 | 
	
		
			
				|  |  | +                .eq(CourseGroup::getId, groupId)
 | 
	
		
			
				|  |  | +                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        if (Objects.isNull(liveCourseGroup)) {
 | 
	
		
			
				|  |  | +            throw new BizException("课程组不存在!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //课程信息
 | 
	
		
			
				|  |  | +        List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
 | 
	
		
			
				|  |  | +                .eq(CourseSchedule::getCourseGroupId, groupId)
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(courseList)) {
 | 
	
		
			
				|  |  | +            throw new BizException("课程组课程不存在!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //校验购买的课程组每节课时间是否和自己的课时冲突
 | 
	
		
			
				|  |  | +        batchCheckStudentCourseTime(studentId, courseList, CourseSchedule::getStartTime, CourseSchedule::getEndTime);
 | 
	
		
			
				|  |  | +        //todo 写订单 返回订单号数据(订单号 金额 等等)
 | 
	
		
			
				|  |  | +        String orderNo = "";
 | 
	
		
			
				|  |  | +        Date now = new Date();
 | 
	
		
			
				|  |  | +        //写course_schedule_student_payment表 作为记录锁定时间用,防止重复购买,如果支付失败则删除该数据
 | 
	
		
			
				|  |  | +        List<CourseScheduleStudentPayment> studentPaymentList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        courseList.forEach(course -> {
 | 
	
		
			
				|  |  | +            CourseScheduleStudentPayment studentPayment = new CourseScheduleStudentPayment();
 | 
	
		
			
				|  |  | +            studentPayment.setUserId(studentId);
 | 
	
		
			
				|  |  | +            studentPayment.setCourseGroupId(groupId);
 | 
	
		
			
				|  |  | +            studentPayment.setCourseId(course.getId());
 | 
	
		
			
				|  |  | +            studentPayment.setOrderNo(orderNo);
 | 
	
		
			
				|  |  | +            studentPayment.setOriginalPrice(liveCourseGroup.getCoursePrice());
 | 
	
		
			
				|  |  | +            studentPayment.setExpectPrice(liveCourseGroup.getCoursePrice());
 | 
	
		
			
				|  |  | +            studentPayment.setActualPrice(liveCourseGroup.getCoursePrice());
 | 
	
		
			
				|  |  | +            studentPayment.setCreatedTime(now);
 | 
	
		
			
				|  |  | +            studentPayment.setUpdatedTime(now);
 | 
	
		
			
				|  |  | +            studentPayment.setCourseType(liveCourseGroup.getType());
 | 
	
		
			
				|  |  | +            studentPaymentList.add(studentPayment);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        courseScheduleStudentPaymentService.getDao().insertBatch(studentPaymentList);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 学生购买直播课程成功-回调成功
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void buyLiveCourseSuccess() {
 | 
	
		
			
				|  |  | +        //写course_group表 pre_student_num_(预计上课人数) +1
 | 
	
		
			
				|  |  | +        //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
 | 
	
		
			
				|  |  | +        //修改订单为成功
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 学生购买直播课失败-回调
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void buyLiveCourseFailed() {
 | 
	
		
			
				|  |  | +        //修改 course_group表 pre_student_num_(预计上课人数) - 1
 | 
	
		
			
				|  |  | +        //删除 course_schedule_student_payment表 数据
 | 
	
		
			
				|  |  | +        //修改订单为失败
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private SysUser getSysUser(Long userId) {
 | 
	
		
			
				|  |  |          return Optional.ofNullable(userId)
 | 
	
		
			
				|  |  |                  .map(sysUserFeignService::queryUserById)
 |