Browse Source

增加 直播课购买流程 部分

hgw 3 years ago
parent
commit
5047645b27

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java

@@ -28,6 +28,7 @@ public class LiveCourseGroupDto implements Serializable {
     private Long teacherId;
 
     @NotNull(message = "课程组名称不能为空")
+    @Size(max = 50, message = "课程组名称长度不能超过50个字")
     @ApiModelProperty(value = "课程组名称")
     private String name;
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
+import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
 import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.entity.RoomUserInfoCache;
@@ -69,6 +70,13 @@ public interface LiveRoomService extends IService<LiveRoom> {
     List<RoomUserInfoCache> queryRoomUserInfo(String roomUid);
 
     /**
+     * 发送消息
+     *
+     * @param message
+     */
+    void publishRoomMessage(ImRoomMessage message);
+
+    /**
      * 方便测试观察房间数据的方法
      */
     Map<String, Object> test(String roomUid);

+ 89 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -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;
@@ -17,6 +19,7 @@ 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.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 +35,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 +262,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 +440,75 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         return redissonClient.getMap(key);
     }
 
+    /**
+     * 学生购买直播课程组
+     *
+     * @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)

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

@@ -91,7 +91,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (StringUtils.isNotBlank(status)) {
             CourseScheduleEnum.existCourseState(status, "查询条件错误,课程状态不正确");
         }
-        param.put("status",status);
+        param.put("status", status);
         String classDate = WrapperUtil.toStr(param, "classDate", "查询时间不能为空!");
         //本月的第一天
         LocalDate firstDay;
@@ -258,7 +258,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
         Integer day = WrapperUtil.toInt(param, "month", "日历的时间日期不能为空!");
         Integer singleCourseMinutes = WrapperUtil.toInt(param, "singleCourseMinutes", "单课时时长不能为空!");
-
+        if (singleCourseMinutes < 25) {
+            throw new BizException("单课时时长不能小于25分钟!");
+        }
         //传入的日期+1天开始
         LocalDate firstDay = LocalDate.of(year, month, day).plusDays(1L);
         //根据firstDay计算出该月的最后一天
@@ -629,10 +631,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * <p>
      * 老师端-课表
      * search:{"classDate":"2022-03-27"}
-     *      search:{"classMonth":"2022-03"}
-     *
+     * search:{"classMonth":"2022-03"}
+     * <p>
      * 老师端-课表-陪练课
-     *      search:{"classDate":"2022-03-27"}
+     * search:{"classDate":"2022-03-27"}
      *
      * @Description: 根据老师id查询购课学员
      * @Author: cy
@@ -672,17 +674,18 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
     /**
      * 按月份计算开始结束日期
+     *
      * @param search
      * @return
      */
-    public MyCourseSearch monthToDate(MyCourseSearch search){
+    public MyCourseSearch monthToDate(MyCourseSearch search) {
         String classMonth = search.getClassMonth();
         String[] classDateSp = classMonth.split("-");
         LocalDate firstDay;
         try {
             firstDay = LocalDate.of(Integer.parseInt(classDateSp[0]), Integer.parseInt(classDateSp[1]), 1);
         } catch (Exception e) {
-            throw new BizException("查询时间格式不正确 ["+classMonth+"]");
+            throw new BizException("查询时间格式不正确 [" + classMonth + "]");
         }
         //本月的最后一天
         LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
@@ -734,6 +737,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
     /**
      * search:  {"classDate":"2022-03-27"}
+     *
      * @Description: 老师端-课表-日历-用户
      * @Author: cy
      * @Date: 2022/4/18

+ 2 - 21
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -391,7 +391,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      *
      * @param message
      */
-    private void publishRoomMessage(ImRoomMessage message) {
+    @Override
+    public void publishRoomMessage(ImRoomMessage message) {
         String msgStr = JSONObject.toJSONString(message);
         log.info("publishRoomMessage message : {}", msgStr);
         IMApiResultInfo resultInfo;
@@ -406,26 +407,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         log.info("publishRoomMessage success: {}", msgStr);
     }
 
-    /**
-     * 学生购买直播课程
-     *
-     * @param param 传入参数
-     *              <p> - groupId    直播课程组id
-     *              <p> - studentId    学员id
-     *              <p> - price 价格
-     */
-    public void buyLiveCourse(Map<String, Object> param) {
-        //锁定课程时间
-
-    }
-
-    /**
-     * 学生购买直播课程成功-回调成功
-     */
-    public void buyLiveCourseSuccess() {
-
-    }
-
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                 .map(sysUserFeignService::queryUserById)