|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/**
|