Ver código fonte

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

liujunchi 3 anos atrás
pai
commit
bbf3861f0a

+ 75 - 59
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

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

+ 7 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -232,6 +232,7 @@
         FROM course_schedule_student_payment p
         LEFT JOIN course_schedule s ON p.course_id_ = s.id_
         WHERE s.teacher_id_=#{teacherId}
+        AND s.status_='ING'
         <![CDATA[ AND s.class_date_  >= #{startDate} ]]>
         <![CDATA[ AND s.class_date_  <= #{endDate} ]]>
     </select>
@@ -294,7 +295,8 @@
         LEFT JOIN course_group g ON cs.course_group_id_ = g.id_
         LEFT JOIN (SELECT course_id_ AS pid,count(*) AS payCount FROM course_schedule_student_payment GROUP BY course_id_ ) p ON cs.id_=p.pid
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
-        WHERE cs.type_='LIVE'
+        WHERE cs.status_='ING'
+        AND cs.type_='LIVE'
         AND cs.teacher_id_=#{param.teacherId}
         AND cs.class_date_=#{param.classDate}
         AND cs.id_ IN(
@@ -326,7 +328,8 @@
         LEFT JOIN course_schedule cs ON p.course_id_=cs.id_
         LEFT JOIN course_group g ON p.course_group_id_ = g.id_
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
-        WHERE p.course_id_ IN (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
+        WHERE cs.status_='ING'
+        AND p.course_id_ IN (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
         AND cs.class_date_=#{param.classDate}
         ORDER BY startTime
     </select>
@@ -570,7 +573,7 @@
         LEFT JOIN course_group g ON s.course_group_id_=g.id_
         WHERE s.teacher_id_=#{teacherId}
         AND s.type_='PRACTICE'
-        AND s.status_ IN ('NOT_START','ING')
+        AND s.status_ = 'ING'
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>
@@ -592,8 +595,7 @@
         LEFT JOIN course_group g ON s.course_group_id_=g.id_
         WHERE s.teacher_id_=#{teacherId}
         AND s.type_='LIVE'
-        AND g.status_='ING'
-        AND s.status_ IN ('NOT_START','ING')
+        AND s.status_ ='ING'
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>