|  | @@ -34,7 +34,9 @@ import com.yonge.toolset.utils.date.DateUtil;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.utils.obj.ObjectUtil;
 | 
	
		
			
				|  |  |  import org.apache.commons.collections.CollectionUtils;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | +import org.redisson.api.RLock;
 | 
	
		
			
				|  |  |  import org.redisson.api.RMap;
 | 
	
		
			
				|  |  | +import org.redisson.api.RedissonClient;
 | 
	
		
			
				|  |  |  import org.slf4j.Logger;
 | 
	
		
			
				|  |  |  import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
	
		
			
				|  | @@ -47,6 +49,7 @@ import java.text.SimpleDateFormat;
 | 
	
		
			
				|  |  |  import java.time.LocalDate;
 | 
	
		
			
				|  |  |  import java.time.temporal.TemporalAdjusters;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  | +import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  |  import java.util.function.BiConsumer;
 | 
	
		
			
				|  |  |  import java.util.function.BiFunction;
 | 
	
		
			
				|  |  |  import java.util.function.Function;
 | 
	
	
		
			
				|  | @@ -66,6 +69,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |      private final static Logger log = LoggerFactory.getLogger(CourseScheduleServiceImpl.class);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  | +    private RedissonClient redissonClient;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  |      private SysUserFeignService sysUserFeignService;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private HolidaysFestivalsService holidaysFestivalsService;
 | 
	
	
		
			
				|  | @@ -896,66 +901,77 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          //批量检查学生课时在数据库是否重复
 | 
	
		
			
				|  |  |          batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        String orderNo = orderReqInfo.getOrderNo();
 | 
	
		
			
				|  |  | -        scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | -        scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
 | 
	
		
			
				|  |  | -        scheduleDto.setMixStudentNum(1);
 | 
	
		
			
				|  |  | -        scheduleDto.setStudentId(studentId);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //写入course_group
 | 
	
		
			
				|  |  | -        baseMapper.addCourseGroup(scheduleDto);
 | 
	
		
			
				|  |  | -        Long groupId = scheduleDto.getGroupId();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //根据老师id获取默认配置声部原价
 | 
	
		
			
				|  |  | -        TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
 | 
	
		
			
				|  |  | -        BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //每课实际价格
 | 
	
		
			
				|  |  | -        Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
 | 
	
		
			
				|  |  | -        for (int i = 0; i < classTime.size(); i++) {
 | 
	
		
			
				|  |  | -            CourseScheduleDate date = classTime.get(i);
 | 
	
		
			
				|  |  | -            CourseSchedule schedule = new CourseSchedule();
 | 
	
		
			
				|  |  | -            schedule.setClassDate(date.getClassDate());
 | 
	
		
			
				|  |  | -            schedule.setStartTime(date.getStartTime());
 | 
	
		
			
				|  |  | -            schedule.setEndTime(date.getEndTime());
 | 
	
		
			
				|  |  | -            schedule.setCourseGroupId(groupId);
 | 
	
		
			
				|  |  | -            schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | -            schedule.classNum(i + 1);
 | 
	
		
			
				|  |  | -            schedule.setTeacherId(scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | -            schedule.setLock(1);
 | 
	
		
			
				|  |  | -            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
 | 
	
		
			
				|  |  | -            schedule.setCreatedBy(scheduleDto.getStudentId());
 | 
	
		
			
				|  |  | -            //写入course_schedule
 | 
	
		
			
				|  |  | -            baseMapper.insert(schedule);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            Long scheduleId = schedule.getId();
 | 
	
		
			
				|  |  | -            CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
 | 
	
		
			
				|  |  | -            payment.setUserId(scheduleDto.getStudentId());
 | 
	
		
			
				|  |  | -            payment.setCourseId(scheduleId);
 | 
	
		
			
				|  |  | -            payment.setCourseGroupId(groupId);
 | 
	
		
			
				|  |  | -            payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | -            payment.setOrderNo(orderNo);
 | 
	
		
			
				|  |  | -            payment.setOriginalPrice(subjectPrice);//原价
 | 
	
		
			
				|  |  | -            payment.setExpectPrice(subjectPrice);//预计价格
 | 
	
		
			
				|  |  | -            payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
 | 
	
		
			
				|  |  | -            //写入course_schedule_student_payment
 | 
	
		
			
				|  |  | -            courseScheduleStudentPaymentService.save(payment);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        RLock lock = redissonClient.getLock("buyPractice:teacherId:"+scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            if(lock.tryLock(20,10, TimeUnit.SECONDS)){
 | 
	
		
			
				|  |  | +                String orderNo = orderReqInfo.getOrderNo();
 | 
	
		
			
				|  |  | +                scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | +                scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
 | 
	
		
			
				|  |  | +                scheduleDto.setMixStudentNum(1);
 | 
	
		
			
				|  |  | +                scheduleDto.setStudentId(studentId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //写入course_group
 | 
	
		
			
				|  |  | +                baseMapper.addCourseGroup(scheduleDto);
 | 
	
		
			
				|  |  | +                Long groupId = scheduleDto.getGroupId();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //根据老师id获取默认配置声部原价
 | 
	
		
			
				|  |  | +                TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
 | 
	
		
			
				|  |  | +                BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //每课实际价格
 | 
	
		
			
				|  |  | +                Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
 | 
	
		
			
				|  |  | +                for (int i = 0; i < classTime.size(); i++) {
 | 
	
		
			
				|  |  | +                    CourseScheduleDate date = classTime.get(i);
 | 
	
		
			
				|  |  | +                    CourseSchedule schedule = new CourseSchedule();
 | 
	
		
			
				|  |  | +                    schedule.setClassDate(date.getClassDate());
 | 
	
		
			
				|  |  | +                    schedule.setStartTime(date.getStartTime());
 | 
	
		
			
				|  |  | +                    schedule.setEndTime(date.getEndTime());
 | 
	
		
			
				|  |  | +                    schedule.setCourseGroupId(groupId);
 | 
	
		
			
				|  |  | +                    schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | +                    schedule.classNum(i + 1);
 | 
	
		
			
				|  |  | +                    schedule.setTeacherId(scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | +                    schedule.setLock(1);
 | 
	
		
			
				|  |  | +                    schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
 | 
	
		
			
				|  |  | +                    schedule.setCreatedBy(scheduleDto.getStudentId());
 | 
	
		
			
				|  |  | +                    //写入course_schedule
 | 
	
		
			
				|  |  | +                    baseMapper.insert(schedule);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    Long scheduleId = schedule.getId();
 | 
	
		
			
				|  |  | +                    CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
 | 
	
		
			
				|  |  | +                    payment.setUserId(scheduleDto.getStudentId());
 | 
	
		
			
				|  |  | +                    payment.setCourseId(scheduleId);
 | 
	
		
			
				|  |  | +                    payment.setCourseGroupId(groupId);
 | 
	
		
			
				|  |  | +                    payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  | +                    payment.setOrderNo(orderNo);
 | 
	
		
			
				|  |  | +                    payment.setOriginalPrice(subjectPrice);//原价
 | 
	
		
			
				|  |  | +                    payment.setExpectPrice(subjectPrice);//预计价格
 | 
	
		
			
				|  |  | +                    payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
 | 
	
		
			
				|  |  | +                    //写入course_schedule_student_payment
 | 
	
		
			
				|  |  | +                    courseScheduleStudentPaymentService.save(payment);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        OrderCreateRes orderCreateRes = new OrderCreateRes();
 | 
	
		
			
				|  |  | -        orderCreateRes.setRes(true);
 | 
	
		
			
				|  |  | -        orderCreateRes.setMerchId(scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | -        orderCreateRes.setBizId(groupId);
 | 
	
		
			
				|  |  | -        orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | -        orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | -        orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
 | 
	
		
			
				|  |  | -        orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
 | 
	
		
			
				|  |  | -        HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
 | 
	
		
			
				|  |  | -        httpResponseResult.setData(orderCreateRes);
 | 
	
		
			
				|  |  | -        log.info("buyPracticeCourse  return {}", httpResponseResult);
 | 
	
		
			
				|  |  | -        return httpResponseResult;
 | 
	
		
			
				|  |  | +                OrderCreateRes orderCreateRes = new OrderCreateRes();
 | 
	
		
			
				|  |  | +                orderCreateRes.setRes(true);
 | 
	
		
			
				|  |  | +                orderCreateRes.setMerchId(scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | +                orderCreateRes.setBizId(groupId);
 | 
	
		
			
				|  |  | +                orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | +                orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
 | 
	
		
			
				|  |  | +                orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
 | 
	
		
			
				|  |  | +                orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
 | 
	
		
			
				|  |  | +                HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
 | 
	
		
			
				|  |  | +                httpResponseResult.setData(orderCreateRes);
 | 
	
		
			
				|  |  | +                log.info("buyPracticeCourse  return {}", httpResponseResult);
 | 
	
		
			
				|  |  | +                return httpResponseResult;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } catch (InterruptedException e) {
 | 
	
		
			
				|  |  | +            log.error("runIfLockCanGet error lockName : {}", "buyPractice:teacherId:"+scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  | +            throw new RuntimeException("runIfLockCanGet error lockName :" + "buyPractice:teacherId:"+scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  | +        } finally {
 | 
	
		
			
				|  |  | +            lock.unlock();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return null;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 |