瀏覽代碼

修改bug
1.直播课有wait pay订单,仍然可以下架
2.未上架的直播课,学员信息错误
3.直播课程组,缺少定时任务,更新课程组状态
4.名字都应返回username

hgw 3 年之前
父節點
當前提交
0db1ab97af
共有 21 個文件被更改,包括 623 次插入118 次删除
  1. 6 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherAttendanceDao.java
  3. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  4. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  5. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentAttendance.java
  6. 132 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAttendance.java
  7. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  8. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherAttendanceService.java
  9. 117 42
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  10. 24 28
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  11. 13 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  12. 137 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  13. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAttendanceServiceImpl.java
  14. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVo.java
  15. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java
  16. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  17. 10 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  18. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  19. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java
  20. 29 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherAttendanceController.java
  21. 0 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

+ 6 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -2,12 +2,12 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
-import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -34,9 +34,12 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
-    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("groupId") Long groupId);
+    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("param") Map<String, Object> param);
 
     //查询所有购买陪练课用户id
     List<Long> selectAll();

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherAttendanceDao.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 老师考勤表(TeacherAttendance)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:21
+ */
+public interface TeacherAttendanceDao extends BaseMapper<TeacherAttendance> {
+
+    int insertBatch(@Param("entities") List<TeacherAttendance> entities);
+
+}
+

+ 1 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -13,8 +13,7 @@ import java.time.LocalDateTime;
  */
 @ApiModel(value = "OrderSearch对象", description = "平台订单表查询对象")
 public class OrderSearch extends QueryInfo{
-	private static final long serialVersionUID = 1L;
-	@ApiModelProperty("交易流水号/订单号")
+    @ApiModelProperty("交易流水号/订单号")
 	private String searchNo;
 	@ApiModelProperty("交易类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 (多选用,分割)")
 	private String orderType;

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java

@@ -11,6 +11,13 @@ import java.util.Date;
  * Created by 2022年3月24日
  */
 public class RoomInfoCache implements Serializable {
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
     @ApiModelProperty(value = "主讲人id")
     private Long speakerId;
 
@@ -56,6 +63,22 @@ public class RoomInfoCache implements Serializable {
     @ApiModelProperty(value = "当前观看人数")
     private Integer lookNum;
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
     public Long getSpeakerId() {
         return speakerId;
     }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentAttendance.java

@@ -18,7 +18,6 @@ import org.springframework.format.annotation.DateTimeFormat;
 @TableName("student_attendance")
 @ApiModel(value = "StudentAttendance对象", description = "学生考勤表")
 public class StudentAttendance implements Serializable {
-	private static final long serialVersionUID = 1L;
     @ApiModelProperty("主键; ")
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;

+ 132 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAttendance.java

@@ -0,0 +1,132 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 老师考勤表(TeacherAttendance)表实体类
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:23
+ */
+@ApiModel(value = "teacher_attendance-老师考勤表")
+public class TeacherAttendance implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键;")
+    private Long id;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师编号;")
+    private Long teacherId;
+
+    @TableField("course_group_type_")
+    @ApiModelProperty(value = "课程组类型PRACTICE、LIVE;")
+    private String courseGroupType;
+
+    @TableField("course_group_id_")
+    @ApiModelProperty(value = "课程组编号;")
+    private Long courseGroupId;
+
+    @TableField("course_schedule_id_")
+    @ApiModelProperty(value = "课程编号;")
+    private Long courseScheduleId;
+
+    @TableField("sign_in_time_")
+    @ApiModelProperty(value = "签到时间")
+    private Date signInTime;
+
+    @TableField("sign_out_time_")
+    @ApiModelProperty(value = "签退时间")
+    private Date signOutTime;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间;")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getCourseGroupType() {
+        return courseGroupType;
+    }
+
+    public void setCourseGroupType(String courseGroupType) {
+        this.courseGroupType = courseGroupType;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Date getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Date signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public Date getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(Date signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}
+

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -3,10 +3,12 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程学生缴费表(CourseScheduleStudentPayment)表服务接口
@@ -21,9 +23,12 @@ public interface CourseScheduleStudentPaymentService extends IService<CourseSche
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
-    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("groupId") Long groupId);
+    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Map<String, Object> param);
 
     /**
      * 根据陪练课 课程id查看购买记录

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherAttendanceService.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+
+/**
+ * 老师考勤表(TeacherAttendance)表服务接口
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:23
+ */
+public interface TeacherAttendanceService extends IService<TeacherAttendance> {
+
+    TeacherAttendanceDao getDao();
+}
+

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

@@ -28,6 +28,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -83,7 +84,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     @Autowired
     private ImGroupService imGroupService;
     @Autowired
-    private UserOrderService orderService;
+    private UserOrderService userOrderService;
+    @Autowired
+    private SysMessageService sysMessageService;
+
     @Override
     public CourseGroupDao getDao() {
         return this.baseMapper;
@@ -116,13 +120,19 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         result.setMixStudentNum(group.getMixStudentNum());
         result.setImGroupId(group.getImGroupId());
         Optional.ofNullable(group.getTeacherId()).map(this::getSysUser)
-                .ifPresent(sysUser -> result.setTeacherName(sysUser.getRealName()));
+                .ifPresent(sysUser -> {
+                    result.setTeacherName(sysUser.getRealName());
+                    result.setUserName(sysUser.getUsername());
+                });
         Optional.ofNullable(group.getSubjectId()).map(subjectService::get)
                 .ifPresent(subject -> result.setSubjectName(subject.getName()));
         //课程组计划
         result.setPlanList(coursePlanService.queryCoursePlanByGroupId(groupId));
-        //课程组学员信息
-        result.setStudentList(courseScheduleStudentPaymentService.queryStudentInfoByGroupId(groupId));
+        //课程组已经购买成功的学员信息
+        Map<String, Object> param = new HashMap<>();
+        param.put("groupId", groupId);
+        param.put("orderState", OrderStatusEnum.PAID.getCode());
+        result.setStudentList(courseScheduleStudentPaymentService.queryStudentInfoByGroupId(param));
         //查询是否购买过该课程组
         Long id = getSysUser().getId();
 
@@ -133,13 +143,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         query.setGoodType(GoodTypeEnum.LIVE.getCode());
         query.setBizId(groupId);
         query.setStatus(OrderStatusEnum.PAID.getCode());
-        List<UserOrderVo> userOrderVos = orderService.selectList(query);
-
-        /*List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                .eq(CourseScheduleStudentPayment::getUserId, id)
-                .eq(CourseScheduleStudentPayment::getCourseGroupId, groupId)
-        );*/
-
+        List<UserOrderVo> userOrderVos = userOrderService.selectList(query);
         result.setExistBuy(0);
         if (CollectionUtils.isNotEmpty(userOrderVos)) {
             result.setExistBuy(1);
@@ -158,32 +162,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      *              <p> - search 模糊搜索关键字
      */
     public PageInfo<CourseGroupVo> queryPageLiveCourseGroup(Map<String, Object> param) {
-        //查询该月的所有课程
+        //查询该月的所有直播课程
         param.put("type", CourseScheduleEnum.LIVE.getCode());
         Page<CourseGroupVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("b.created_time_");
         IPage<CourseGroupVo> page = baseMapper.queryTeacherCourseGroup(pageInfo, param);
-        //学生端查询报名中的课程组需要标明该学生是否已经购买过该课程组
-        String os = WrapperUtil.toStr(param, "os");
-        if ("student".equals(os) && CollectionUtils.isNotEmpty(page.getRecords())) {
-            //获取当前课程组Id
-            List<CourseGroupVo> records = page.getRecords();
-            List<Long> groupId = records.stream().map(CourseGroupVo::getCourseGroupId).collect(Collectors.toList());
-            //根据学生id 及 课程组id集合查询购买记录
-            List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                    .eq(CourseScheduleStudentPayment::getUserId, getSysUser().getId())
-                    .in(CourseScheduleStudentPayment::getCourseGroupId, groupId)
-            );
-            if (CollectionUtils.isNotEmpty(paymentList)) {
-                Map<Long, List<CourseScheduleStudentPayment>> payMap = WrapperUtil.groupList(paymentList, CourseScheduleStudentPayment::getCourseGroupId);
-                records.forEach(o -> {
-                    o.setExistBuy(0);
-                    if (payMap.containsKey(o.getCourseGroupId())) {
-                        o.setExistBuy(1);
-                    }
-                });
-            }
-        }
         return PageUtil.pageInfo(page);
     }
 
@@ -274,9 +257,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         if (courseStateFunc.test(CourseGroupEnum.ING)) {
             throw new BizException("课程组进行中,无法下架/取消课程组!");
         } else if (courseStateFunc.test(CourseGroupEnum.APPLY)) {
-            //已上架没人买的课程可以下架
-            if (group.getPreStudentNum() > 0) {
-                throw new BizException("课程组已有学生购买,无法下架/取消课程组!");
+            //查询订单有人已经在支付中则无法下架
+            List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                    .eq(CourseScheduleStudentPayment::getCourseGroupId, groupId));
+            if (CollectionUtils.isNotEmpty(list)) {
+                throw new BizException("课程组已有学生付款或有待付款的订单,无法下架/取消课程组!");
             }
         } else if (courseStateFunc.test(CourseGroupEnum.COMPLETE)) {
             throw new BizException("课程组已完结!");
@@ -677,17 +662,25 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         log.info("buyLiveCourseSuccess param :{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
         //更新课程组的购买人数+1
-        CourseScheduleStudentPayment studentPayment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
         );
-        if (Objects.isNull(studentPayment)) {
-            throw new BizException("订单不存在!");
+        CourseScheduleStudentPayment studentPayment;
+        if (CollectionUtils.isEmpty(studentPaymentList)) {
+            log.info("buyLiveCourseSuccess >>> 订单不存在!orderParam: {}", JSON.toJSONString(orderParam));
+            throw new BizException("订单不存在");
+        } else {
+            studentPayment = studentPaymentList.get(0);
         }
-        //更新课程组的购买人数+1
-        this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
         //课程组信息
         CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getId, studentPayment.getCourseGroupId()));
+        if (Objects.isNull(courseGroup)) {
+            log.info("buyLiveCourseSuccess >>> 课程组不存在!orderParam: {}", JSON.toJSONString(orderParam));
+            throw new BizException("课程组不存在");
+        }
+        //更新课程组的购买人数+1
+        this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
         //课程信息
         List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
@@ -719,6 +712,85 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         });
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyLiveCourseSuccess ok");
+        //课程购买成功后进行消息推送
+        buyLiveSendMessage(studentPayment, courseGroup);
+    }
+
+    /**
+     * 课程购买成功后进行消息推送
+     *
+     * @param studentPayment 学生购买信息
+     * @param courseGroup    课程组信息
+     */
+    private void buyLiveSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup) {
+        //查询老师信息
+        SysUser teacherInfo = getSysUser(courseGroup.getTeacherId());
+        //查询学生信息
+        SysUser studentInfo = getSysUser(studentPayment.getUserId());
+        try {
+            //极光-消息推送-学生端-通知学生购买成功-跳转到APP
+            MessageTypeEnum liveBuy = MessageTypeEnum.LIVE_BUY;
+            //查询推送跳转的url
+            String liveBuyUrl = sysMessageService.selectConfigUrl(liveBuy.getCode());
+            Map<Long, String> studentReceivers = new HashMap<>();
+            studentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveBuy,
+                    studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                    teacherInfo.getUsername(), courseGroup.getName(), liveBuyUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage LIVE_BUY ok");
+
+            //短信-消息推送-学生端-通知学生购买成功-跳转到APP
+            MessageTypeEnum smsLiveBuy = MessageTypeEnum.SMS_LIVE_BUY;
+            //查询推送跳转的url
+            String smsLiveBuyUrl = sysMessageService.selectConfigUrl(smsLiveBuy.getCode());
+            Map<Long, String> smsStudentReceivers = new HashMap<>();
+            smsStudentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsLiveBuy,
+                    smsStudentReceivers, null, 0, null, null,
+                    teacherInfo.getUsername(), courseGroup.getName(), smsLiveBuyUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
+
+            //极光-消息推送-老师端-通知老师有学生购买课程-跳转到APP
+            MessageTypeEnum studentBuyLive = MessageTypeEnum.STUDENT_BUY_LIVE;
+            //查询推送跳转的url
+            String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode());
+            Map<Long, String> teacherReceivers = new HashMap<>();
+            teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
+                    teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                    studentInfo.getUsername(), courseGroup.getName(), studentBuyLiveUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
+
+            //短信-消息推送-老师端-通知老师有学生购买课程-无需跳转到APP
+            Map<Long, String> smsTeacherReceivers = new HashMap<>();
+            smsTeacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_BUY_LIVE,
+                    smsTeacherReceivers, null, 0, null, null,
+                    studentInfo.getUsername(), courseGroup.getName());
+            log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
+
+            //判断是否到达最低成课人数
+            if (Objects.equals(courseGroup.getPreStudentNum(), courseGroup.getMixStudentNum())) {
+                //极光-消息推送-老师端-通知老师课程最小开课人数已达标
+                MessageTypeEnum liveCompletionSuccess = MessageTypeEnum.LIVE_COMPLETION_SUCCESS;
+                Map<Long, String> liveCompletionSuccessReceivers = new HashMap<>();
+                liveCompletionSuccessReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveCompletionSuccess,
+                        liveCompletionSuccessReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                        courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage LIVE_COMPLETION_SUCCESS ok");
+
+                //短信-消息推送-老师端-通知老师课程最小开课人数已达标
+                Map<Long, String> smsLiveCompletionSuccessReceivers = new HashMap<>();
+                smsLiveCompletionSuccessReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_LIVE_COMPLETION_SUCCESS,
+                        smsLiveCompletionSuccessReceivers, null, 0, null, null,
+                        courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_LIVE_COMPLETION_SUCCESS ok");
+            }
+        } catch (Exception ex) {
+            log.error("buyLiveCourseSuccess buyLiveSendMessage error", ex.getCause());
+        }
     }
 
     @Override
@@ -751,10 +823,13 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */
     private void openCourseGroup() {
+        LocalDate today = LocalDate.now();
+        LocalDate yesterday = today.plusDays(-1L);
         //查询今天未开售的课程组
         List<CourseGroup> courseGroupList = this.list(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
-                .eq(CourseGroup::getSalesStartDate, LocalDate.now())
+                .ge(CourseGroup::getSalesStartDate, yesterday)
+                .le(CourseGroup::getSalesStartDate, today)
                 .eq(CourseGroup::getStatus, CourseGroupEnum.NOT_SALE.getCode()));
         if (CollectionUtils.isEmpty(courseGroupList)) {
             return;

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

@@ -347,12 +347,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         int addDay = 0;
         //获取每日日期数据
         while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
-            CourseCalendarEntity entity = new CourseCalendarEntity();
-            List<CourseTimeEntity> times = new ArrayList<>();
+            //将每日上课时间时间添加到日历中
+            CourseCalendarEntity entity = opsCourseDayTime(addDay, dayTime);
             //获取当前日期
             entity.setDate(firstDay.toString());
-            //将每日上课时间时间添加到日历中
-            opsCourseDayTime(addDay, entity, times, dayTime);
             list.add(entity);
             firstDay = firstDay.plusDays(1L);
             addDay++;
@@ -490,11 +488,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * 将每日上课时间时间添加到日历中
      *
      * @param addDay       添加的天数
-     * @param entity       实体数据
-     * @param times        课程数据集合
      * @param timeEntities 每日上课时间集合
      */
-    private void opsCourseDayTime(int addDay, CourseCalendarEntity entity, List<CourseTimeEntity> times, List<CourseTimeEntity> timeEntities) {
+    private CourseCalendarEntity opsCourseDayTime(int addDay, List<CourseTimeEntity> timeEntities) {
+        CourseCalendarEntity entity = new CourseCalendarEntity();
+        List<CourseTimeEntity> times = new ArrayList<>();
         timeEntities.forEach(time -> {
             CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
             courseTimeEntity.setStartTime(DateUtil.addDays(time.getStartTime(), addDay));
@@ -502,6 +500,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             times.add(courseTimeEntity);
         });
         entity.setCourseTime(times);
+        return entity;
     }
 
     /**
@@ -513,13 +512,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Map<Integer, JSONArray> teacherPracticeTime = new HashMap<>();
         //将老师设置的陪练课时间放入map中
         BiConsumer<String, Integer> timeCon = (timeStr, weekNum) -> {
-            if (StringUtils.isBlank(timeStr)) {
-                return;
-            }
-            JSONArray objects = JSONObject.parseArray(timeStr);
-            if (CollectionUtils.isNotEmpty(objects)) {
-                teacherPracticeTime.put(weekNum, objects);
-            }
+            Optional.ofNullable(timeStr)
+                    .map(JSONObject::parseArray)
+                    .filter(CollectionUtils::isNotEmpty)
+                    .ifPresent(objects -> teacherPracticeTime.put(weekNum, objects));
         };
         timeCon.accept(teacherTime.getMonday(), 1);
         timeCon.accept(teacherTime.getTuesday(), 2);
@@ -950,8 +946,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         //消息推送
         try {
-            practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(),paymentList.size() + "",orderNo);
-        }catch (Exception e){
+            practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(), paymentList.size() + "", orderNo);
+        } catch (Exception e) {
             log.error("陪练课消息推送失败");
         }
     }
@@ -997,14 +993,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Date: 2022/4/22
      */
     @Override
-    public StudentHomePage queryLiveAndVideo(Long studentId,Long teacherId) {
+    public StudentHomePage queryLiveAndVideo(Long studentId, Long teacherId) {
         StudentHomePage homePage = new StudentHomePage();
-        if (teacherId==null){
+        if (teacherId == null) {
             homePage.setLiveList(baseMapper.selectLive());
             homePage.setVideoList(baseMapper.selectVideo());
             homePage.setRecentCourses(baseMapper.selectRecentCourses(studentId));
         }
-        if (studentId==null){
+        if (studentId == null) {
             homePage.setRecentCourses(baseMapper.selectRecentCoursesTeacher(teacherId));
         }
         return homePage;
@@ -1064,27 +1060,27 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
                 teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
                 student.getUsername(), courseNum, teacherUrl);
-        log.info("send success {}",MessageTypeEnum.STUDENT_BUY_PRACTICE);
+        log.info("send success {}", MessageTypeEnum.STUDENT_BUY_PRACTICE);
 
         //老师端-学生买陪练课(短信)
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE,
                 teacherSms, null, 0, null, null,
                 student.getUsername(), courseNum);
-        log.info("send success {}",MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
+        log.info("send success {}", MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
 
         //学生端-买陪练课
         String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
                 studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
                 teacher.getUsername(), courseNum, studentUrl);
-        log.info("send success {}",MessageTypeEnum.PRACTICE_BUY);
+        log.info("send success {}", MessageTypeEnum.PRACTICE_BUY);
 
         //学生端-买陪练课(短信)
         String studentSmsUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_PRACTICE_BUY.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_PRACTICE_BUY,
                 studentSms, null, 0, null, null,
-                teacher.getUsername(), courseNum,studentSmsUrl);
-        log.info("send success {}",MessageTypeEnum.SMS_PRACTICE_BUY);
+                teacher.getUsername(), courseNum, studentSmsUrl);
+        log.info("send success {}", MessageTypeEnum.SMS_PRACTICE_BUY);
 
         List<String> startTimeList = baseMapper.selectStartTime(orderNo);
         for (String startTime : startTimeList) {
@@ -1098,7 +1094,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     studentReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.STUDENT.getCode(),
                     teacher.getUsername());
         }
-        log.info("send success {}",MessageTypeEnum.PRACTICE_REMIND);
+        log.info("send success {}", MessageTypeEnum.PRACTICE_REMIND);
     }
 
     /**
@@ -1106,11 +1102,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/5/6
      */
-    public void courseRemind(){
+    public void courseRemind() {
         String tomorrow = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.addDays1(new Date(), 1));
         //查询明天有课的老师
-        List<SysUser> userList=baseMapper.selectTeacher(tomorrow);
-        if (CollectionUtils.isNotEmpty(userList)){
+        List<SysUser> userList = baseMapper.selectTeacher(tomorrow);
+        if (CollectionUtils.isNotEmpty(userList)) {
             for (SysUser sysUser : userList) {
 
             }

+ 13 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -6,15 +6,13 @@ import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleStudentPaymentService;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程学生缴费表(CourseScheduleStudentPayment)表服务实现类
@@ -35,28 +33,29 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
     @Override
-    public List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Long groupId) {
-        return baseMapper.queryStudentInfoByGroupId(groupId);
+    public List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Map<String, Object> param) {
+        return baseMapper.queryStudentInfoByGroupId(param);
     }
 
     @Override
     public CourseScheduleStudentPayment getByCourseId(Long courseId) {
         List<CourseScheduleStudentPayment> list = this.lambdaQuery()
-                                                      .eq(CourseScheduleStudentPayment::getCourseId, courseId)
-                                                      .eq(CourseScheduleStudentPayment::getCourseType,
-                                                          CourseScheduleEnum.PRACTICE.getCode())
-                                                      .isNotNull(CourseScheduleStudentPayment::getUserId)
-                                                      .list();
+                .eq(CourseScheduleStudentPayment::getCourseId, courseId)
+                .eq(CourseScheduleStudentPayment::getCourseType,
+                        CourseScheduleEnum.PRACTICE.getCode())
+                .isNotNull(CourseScheduleStudentPayment::getUserId)
+                .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }
         return list.get(0);
-
     }
 
-
 }
 

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

@@ -6,14 +6,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
-import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.RoomVo;
@@ -62,6 +58,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     private CourseScheduleService courseScheduleService;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
+    private TeacherAttendanceService teacherAttendanceService;
 
     //生成房间UID
     public static BiFunction<Long, RoomTypeEnum, String> GenRoomUid = (userId, en) -> String.join("-", COOLESHOW, en.getCode(), userId.toString(), new Date().getTime() + "");
@@ -204,7 +210,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         Boolean check = WrapperUtil.inInterSection(now, now, course.getStartTime(), course.getEndTime(), false);
         if (check) {
             //如果当前时间和课程时间有交集则不能开启临时直播
-            throw new BizException("当前有陪练课无法开启直播");
+            throw new BizException("当前有课无法开启直播");
         }
     }
 
@@ -242,6 +248,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         String configValue = sysConfigService.findConfigValue(PRE_CREATE_LIVE_ROOM_MINUTE);
         roomCache.setExpiredMinute(Integer.parseInt(configValue));
         roomCache.setRoomType(room.getType());
+        roomCache.setCourseId(room.getCourseId());
+        roomCache.setCourseGroupId(room.getCourseGroupId());
 
         //写入房间信息
         redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, room.getRoomUid()))
@@ -299,6 +307,34 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             if (now.getTime() >= expiredDate.getTime()) {
                 //删除房间
                 destroyLiveRoom(room.getRoomUid());
+                //查询老师分润表
+                CourseScheduleTeacherSalary salary = courseScheduleTeacherSalaryService.getOne(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
+                        .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
+                );
+                if (Objects.isNull(salary)) {
+                    return;
+                }
+                //查询该学生及课程id 对应的支付订单号
+                CourseScheduleStudentPayment payment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                        .eq(CourseScheduleStudentPayment::getCourseId, room.getCourseId())
+                        .eq(CourseScheduleStudentPayment::getUserId, salary.getStudentId())
+                );
+                if (Objects.isNull(payment)) {
+                    return;
+                }
+                //获取教师课酬写入到金额变更表
+                UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
+                userAccountRecord.setUserId(room.getSpeakerId());
+                userAccountRecord.setInOrOut(InOrOutEnum.IN);
+                userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
+                userAccountRecord.setBizId(room.getCourseId());
+                userAccountRecord.setBizName(room.getRoomTitle());
+                userAccountRecord.setTransAmount(salary.getExpectSalary());//扣除手续费后所得金额
+                userAccountRecord.setOrderNo(payment.getOrderNo());
+                userAccountService.accountChange(userAccountRecord);
+                //修改老师课酬表
+                salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
+                courseScheduleTeacherSalaryService.updateById(salary);
             }
         });
     }
@@ -325,7 +361,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         log.info("destroyLiveRoom success: {}", roomId);
     }
 
-
     /**
      * <p>主讲人处理进入和退出房间数据
      * <p>观看者只处理退出房间数据
@@ -369,28 +404,52 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
                 return;
             }
             RoomInfoCache roomInfo = roomInfoCache.get();
+            //用户id
+            Long userId = Long.valueOf(userIdStr);
             //主讲人
             if (roomInfo.getSpeakerId().toString().equals(userIdStr)) {
+                //进退房间写老师考勤表
+                TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
+                        .eq(TeacherAttendance::getTeacherId, userId)
+                        .eq(TeacherAttendance::getCourseScheduleId, roomInfo.getCourseId()));
                 //主讲人进入房间
                 if (user.getStatus().equals("0")) {
                     roomInfo.setSpeakerState(0);
                     roomInfo.setJoinRoomTime(now);
                     log.info("opsRoom>>>> join roomInfo {}", JSONObject.toJSONString(roomInfo));
                     roomInfoCache.set(roomInfo);
+                    //查询老师是否有进入过,没有则写老师考勤表的进入时间
+                    if (Objects.isNull(teacherAttendance)) {
+                        setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+                    }
                     return;
                 }
                 roomInfo.setSpeakerState(1);
                 roomInfo.setExitRoomTime(now);
                 log.info("opsRoom>>>> exit roomInfo {}", JSONObject.toJSONString(roomInfo));
                 roomInfoCache.set(roomInfo);
+                if (Objects.isNull(teacherAttendance)) {
+                    teacherAttendance = new TeacherAttendance();
+                    teacherAttendance.setTeacherId(userId);
+                    teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+                    teacherAttendance.setCourseGroupId(roomInfo.getCourseGroupId());
+                    teacherAttendance.setCourseScheduleId(roomInfo.getCourseId());
+                    teacherAttendance.setSignInTime(now);
+                    teacherAttendance.setSignOutTime(now);
+                    teacherAttendance.setCreateTime(now);
+                    teacherAttendanceService.save(teacherAttendance);
+                } else {
+                    //修改老师考勤表
+                    teacherAttendance.setSignOutTime(now);
+                    teacherAttendance.setUpdateTime(now);
+                    teacherAttendanceService.updateById(teacherAttendance);
+                }
                 return;
             }
-            //观看者只接受退出消息 status=0 是进入房间
+            //观看者只需要接收退出房间的消息 status=0进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
-            //观看者
-            Long userId = Long.valueOf(userIdStr);
             //从房间累计用户信息中查询该用户的信息
             RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
             //该房间未查询到用户数据则不处理
@@ -418,6 +477,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setLastOutTime(now);
             userInfo.setState(1);
             roomTotalUser.fastPut(userId, userInfo);
+            //todo 写学生考勤表
+
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
         });
 
@@ -459,8 +520,13 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             roomInfo.setSpeakerState(0);
             roomInfo.setJoinRoomTime(now);
             roomInfoCache.set(roomInfo);
+            //查询老师是否有进入过,没有则写老师考勤表的进入时间
+            setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
             return roomInfo;
         }
+        //todo 查询是否是临时直播间,临时直播间可以直接进入教师
+        //todo 校验观看者是否可以进入该房间,查询该学员购买成功则有权限进入该房间
+
 
         //房间累计用户信息-指只要进入到该房间的用户都要记录
         RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
@@ -476,6 +542,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setUserId(sysUser.getId());
             userInfo.setUserName(sysUser.getRealName());
             userInfo.setFirstJoinTime(now);
+            //查询学生是否有进入过,没有则写学生考勤表的进入时间
+            setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         }
         userInfo.setState(0);//0:在房间 1:不在房间
         userInfo.setDynamicJoinTime(now);
@@ -485,6 +553,55 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
+     * 查询学生是否有进入过,没有则写学生考勤表的进入时间
+     *
+     * @param studentId     学生id
+     * @param courseGroupId 课程组id
+     * @param courseId      课程id
+     */
+    private void setStudentAttendance(Long studentId, Long courseGroupId, Long courseId) {
+        Date now = new Date();
+        //写学生第一次进入时间
+        StudentAttendance studentAttendance = studentAttendanceService.getOne(Wrappers.<StudentAttendance>lambdaQuery()
+                .eq(StudentAttendance::getStudentId, studentId)
+                .eq(StudentAttendance::getCourseScheduleId, courseId));
+        if (Objects.isNull(studentAttendance)) {
+            studentAttendance = new StudentAttendance();
+            studentAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+            studentAttendance.setCourseGroupId(courseGroupId);
+            studentAttendance.setCourseScheduleId(courseId);
+            studentAttendance.setStudentId(studentId);
+            studentAttendance.setSignInTime(now);
+            studentAttendance.setCreateTime(now);
+            studentAttendanceService.save(studentAttendance);
+        }
+    }
+
+    /**
+     * 查询老师是否有进入过,没有则写老师考勤表的进入时间
+     *
+     * @param teacherId     老师id
+     * @param courseGroupId 课程组id
+     * @param courseId      课程id
+     */
+    private void setTeacherAttendance(Long teacherId, Long courseGroupId, Long courseId) {
+        TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
+                .eq(TeacherAttendance::getTeacherId, teacherId)
+                .eq(TeacherAttendance::getCourseScheduleId, courseId));
+        if (Objects.isNull(teacherAttendance)) {
+            Date now = new Date();
+            teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setTeacherId(teacherId);
+            teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+            teacherAttendance.setCourseGroupId(courseGroupId);
+            teacherAttendance.setCourseScheduleId(courseId);
+            teacherAttendance.setSignInTime(now);
+            teacherAttendance.setCreateTime(now);
+            teacherAttendanceService.save(teacherAttendance);
+        }
+    }
+
+    /**
      * 发送消息
      *
      * @param message
@@ -575,16 +692,15 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public Map<String, Object> test(String roomUid) {
         //result
         Map<String, Object> result = new HashMap<>();
-        //{"day":"01","month":"05","year":"2022","singleCourseMinutes":60,"teacherId":4}
-        Map<String, Object> param = new HashMap<>();
-        param.put("day", "05");
-        param.put("month", "06");
-        param.put("year", "2022");
-        param.put("teacherId", "174");
-        param.put("studentId", 164);
-        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
+//        Map<String, Object> param = new HashMap<>();
+//        param.put("day", "05");
+//        param.put("month", "06");
+//        param.put("year", "2022");
+//        param.put("teacherId", "174");
+//        param.put("studentId", 164);
+//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
 //        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createLiveCourseCalendar(param);
-        result.put("自动生成课时", courseTimeEntities);
+//        result.put("自动生成课时", courseTimeEntities);
 
         //获取房间信息
         RBucket<RoomInfoCache> speakerCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));

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

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+import com.yonge.cooleshow.biz.dal.service.TeacherAttendanceService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 老师考勤表(TeacherAttendance)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:24
+ */
+@Service("teacherAttendanceService")
+public class TeacherAttendanceServiceImpl extends ServiceImpl<TeacherAttendanceDao, TeacherAttendance> implements TeacherAttendanceService {
+
+    private final static Logger log = LoggerFactory.getLogger(TeacherAttendanceServiceImpl.class);
+
+    @Override
+    public TeacherAttendanceDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVo.java

@@ -47,6 +47,9 @@ public class CourseGroupVo implements Serializable {
     @ApiModelProperty(value = "老师名称")
     private String teacherName;
 
+    @ApiModelProperty(value = "昵称")
+    private String userName;
+
     @ApiModelProperty(value = "课程组售价")
     private BigDecimal coursePrice;
 
@@ -156,6 +159,14 @@ public class CourseGroupVo implements Serializable {
         this.teacherName = teacherName;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
     public BigDecimal getCoursePrice() {
         return coursePrice;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java

@@ -87,6 +87,9 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
         @ApiModelProperty(value = "学员名称")
         private String studentName;
 
+        @ApiModelProperty(value = "昵称")
+        private String userName;
+
         @ApiModelProperty(value = "头像")
         private String avatar;
 
@@ -110,6 +113,14 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
             this.studentName = studentName;
         }
 
+        public String getUserName() {
+            return userName;
+        }
+
+        public void setUserName(String userName) {
+            this.userName = userName;
+        }
+
         public String getAvatar() {
             return avatar;
         }

+ 4 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -64,10 +64,13 @@
         b.sales_start_date_           as salesStartDate,
         b.sales_end_date_             as salesEndDate,
         b.mix_student_num_            as mixStudentNum,
-        b.im_group_id_              as imGroupId
+        b.im_group_id_              as imGroupId,
+        if(o.status_ = 'PAID', 1, 0)  as existBuy
         from course_group as b
         left join subject as s on b.subject_id_ = s.id_
         left join sys_user as u on b.teacher_id_ = u.id_
+        left join user_order_detail as d on b.id_ = d.biz_id_
+        left join user_order as o on d.order_no_ = o.order_no_
         <where>
             <if test="param.teacherId != null">
                 and b.teacher_id_ = #{param.teacherId}

+ 10 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -44,14 +44,22 @@
         </where>
     </select>
 
-    <select id="queryStudentInfoByGroupId" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo$CourseBuyStudentVo">
+    <select id="queryStudentInfoByGroupId" parameterType="map" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo$CourseBuyStudentVo">
         select distinct a.user_id_      as studentId,
                b.real_name_    as studentName,
+               b.username_    as userName,
                b.avatar_ as avatar,
                a.created_time_ as createTime
         from course_schedule_student_payment as a
                  left join sys_user as b on a.user_id_ = b.id_
-        where a.course_group_id_ = #{groupId}
+                 left join user_order as o on a.order_no_ = o.order_no_
+        where a.course_group_id_ = #{param.groupId}
+        <if test="param.orderState != null and param.orderState != ''">
+            AND o.status_ = #{param.orderState}
+        </if>
+        <if test="param.userId != null and param.userId != ''">
+            AND a.user_id_ = #{param.userId}
+        </if>
     </select>
     <select id="selectAll" resultType="java.lang.Long">
         SELECT user_id_ FROM course_schedule_student_payment WHERE course_type_ = 'PRACTICE'

+ 33 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao">
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.TeacherAttendance">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="teacher_id_" jdbcType="INTEGER" property="teacherId"/>
+        <result column="course_group_type_" jdbcType="VARCHAR" property="courseGroupType"/>
+        <result column="course_group_id_" jdbcType="INTEGER" property="courseGroupId"/>
+        <result column="course_schedule_id_" jdbcType="INTEGER" property="courseScheduleId"/>
+        <result column="sign_in_time_" jdbcType="TIMESTAMP" property="signInTime"/>
+        <result column="sign_out_time_" jdbcType="TIMESTAMP" property="signOutTime"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , teacher_id_, course_group_type_, course_group_id_, course_schedule_id_, sign_in_time_, sign_out_time_,
+        create_time_, update_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.yonge.cooleshow.biz.dal.entity.TeacherAttendance">
+        insert into teacher_attendance(teacher_id_, course_group_type_, course_group_id_, course_schedule_id_,
+        sign_in_time_, sign_out_time_, create_time_, update_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.teacherId}, #{entity.courseGroupType}, #{entity.courseGroupId}, #{entity.courseScheduleId},
+            #{entity.signInTime}, #{entity.signOutTime}, #{entity.createTime}, #{entity.updateTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 0 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java

@@ -47,7 +47,6 @@ public class StudentCourseGroupController extends BaseController {
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
-        param.put("os","student");
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }
 

+ 29 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherAttendanceController.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.teacher.controller;
+
+
+import com.yonge.cooleshow.biz.dal.service.TeacherAttendanceService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 老师考勤表(TeacherAttendance)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:02
+ */
+@Api(tags = "老师考勤表")
+@RestController
+@RequestMapping("/teacherAttendance")
+public class TeacherAttendanceController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TeacherAttendanceService teacherAttendanceService;
+
+}
+

+ 0 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -49,7 +49,6 @@ public class TeacherCourseGroupController extends BaseController {
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
-        param.put("os","teacher");
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }