Parcourir la source

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

liujunchi il y a 3 ans
Parent
commit
771005950e

+ 8 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java

@@ -32,4 +32,12 @@ public interface TeacherFeignService {
      */
     @GetMapping("/task/courseRemind")
     HttpResponseResult<Object> courseRemind();
+
+    /**
+     * @Description: 更行课程状态
+     * @Author: cy
+     * @Date: 2022/5/17
+     */
+    @GetMapping("/task/courseStatus")
+    HttpResponseResult<Object> courseStatus();
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java

@@ -21,4 +21,9 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
     public HttpResponseResult<Object> courseRemind() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Object> courseStatus() {
+        return null;
+    }
 }

+ 22 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseStatusTask.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/25 10:30
+ */
+@Service
+public class CourseStatusTask extends BaseTask {
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.courseStatus();
+    }
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -210,4 +210,8 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     BigDecimal selectPrice(@Param("teacherId") Long teacherId, @Param("subjectId") Long subjectId);
 
     List<CourseSchedule> selectSchedule(Integer courseId);
+
+    void updateStartTime();
+
+    void updateEndTime();
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -233,5 +233,6 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     Map<String, String> selectRoomConfig();
     void test();
+    void scheduleTask();
 }
 

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

@@ -21,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -34,7 +35,6 @@ 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;
@@ -870,12 +870,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     }
 
     /**
-     * @Description: 学生购买陪练课
+     * @Description: 陪练课购买记录
      * @Author: cy
-     * @Date: 2022/4/21
+     * @Date: 2022/5/16
      */
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<OrderCreateRes> buyPracticeCourse(OrderReq.OrderReqInfo orderReqInfo) {
+    public HttpResponseResult<OrderCreateRes> buyPracticeCourseTran(OrderReq.OrderReqInfo orderReqInfo) {
         log.info("buyPracticeCourse  param:{}", JSON.toJSONString(orderReqInfo));
         Long studentId = orderReqInfo.getUserId();
 
@@ -897,83 +897,84 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (multiply.compareTo(scheduleDto.getCoursePrice()) != 0) {
             throw new BizException("价格异常。预计价格:{},实际价格:{}", multiply, scheduleDto.getCoursePrice());
         }
-
         //批量检查老师课时在数据库是否重复
         batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
         //批量检查学生课时在数据库是否重复
         batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
 
-        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;
-            }
-        } 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();
+        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);
         }
-        return null;
+
+        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;
+    }
+
+    /**
+     * @Description: 学生购买陪练课
+     * @Author: cy
+     * @Date: 2022/4/21
+     */
+    public HttpResponseResult<OrderCreateRes> buyPracticeCourse(OrderReq.OrderReqInfo orderReqInfo) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        PracticeScheduleDto scheduleDto = objectMapper.convertValue(orderReqInfo.getBizContent(), PracticeScheduleDto.class);
+        return DistributedLock.of(redissonClient)
+                .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + scheduleDto.getTeacherId())
+                        , () -> this.buyPracticeCourseTran(orderReqInfo), 60L, TimeUnit.SECONDS);
     }
 
     /**
@@ -1395,4 +1396,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         return rList;
     }
+
+    /**
+     * @Description: 定时修改课程状态
+     * @Author: cy
+     * @Date: 2022/5/17
+     */
+    public void scheduleTask(){
+        baseMapper.updateStartTime();
+        baseMapper.updateEndTime();
+    }
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFollow.java

@@ -28,6 +28,8 @@ public class MyFollow extends BaseEntity {
     private Integer expTime;
     @ApiModelProperty("是否在直播")
     private Integer liveFlag;
+    @ApiModelProperty("房间编号")
+    private String roomUid;
 
     @ApiModelProperty("音乐人(0:否 1:是)")
     private Integer musicianFlag;
@@ -36,6 +38,14 @@ public class MyFollow extends BaseEntity {
     @ApiModelProperty("专业技能")
     private String subjectName;
 
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
     public Integer getEntryFlag() {
         return entryFlag;
     }

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

@@ -190,7 +190,7 @@
         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})
+        (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND lock_=0 AND s.teacher_id_=#{param.teacherId})
         <if test="param.status !=null and param.status !=''">
             AND cs.status_ = #{param.status}
         </if>
@@ -754,4 +754,10 @@
             WHERE user_id_=(SELECT user_id_ FROM course_schedule_student_payment WHERE course_id_=#{courseId} AND course_type_='PRACTICE')
         )
     </select>
+    <update id="updateStartTime">
+        UPDATE course_schedule SET status_='ING' WHERE <![CDATA[ start_time_ <= NOW() ]]> <![CDATA[ AND NOW() <= end_time_ ]]>
+    </update>
+    <update id="updateEndTime">
+        UPDATE course_schedule SET status_='COMPLETE' WHERE <![CDATA[ end_time_ <= NOW() ]]>
+    </update>
 </mapper>

+ 3 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -122,19 +122,19 @@
             u.username_ AS userName,
             u.real_name_ AS realName,
             u.gender_ AS gender,
-
             t.star_grade_ AS starGrade,
             t.fans_num_ AS fansNum,
             t.live_flag_ AS liveFlag,
             t.exp_time_ AS expTime,
-
             tr.musician_flag_ AS musicianFlag,
             tr.entry_flag_ AS entryFlag,
-            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,tr.subject_id_)) AS subjectName
+            (SELECT group_concat( name_ ) FROM `subject` WHERE find_in_set( id_, tr.subject_id_ )) AS subjectName,
+            r.room_uid_ AS roomUid
         FROM student_star s
         LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
         LEFT JOIN teacher_total t ON s.teacher_id_ = t.user_id_
         LEFT JOIN teacher tr ON s.teacher_id_ = tr.user_id_
+        LEFT JOIN (SELECT room_uid_,speaker_id_ FROM live_room WHERE live_state_=1) r ON t.user_id_= r.speaker_id_
         WHERE s.student_id_ = #{studentId}
     </select>
 </mapper>

+ 6 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -58,4 +58,10 @@ public class TaskController extends BaseController {
         scheduleService.courseRemind();
         return HttpResponseResult.succeed();
     }
+
+    @GetMapping("/courseStatus")
+    public HttpResponseResult<Object> courseStatus() {
+        scheduleService.scheduleTask();
+        return HttpResponseResult.succeed();
+    }
 }