瀏覽代碼

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

liujunchi 3 年之前
父節點
當前提交
0cae379890
共有 40 個文件被更改,包括 929 次插入251 次删除
  1. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  2. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  3. 21 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseRemindTask.java
  4. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  5. 6 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  6. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherAttendanceDao.java
  7. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  8. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  9. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentAttendance.java
  10. 132 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAttendance.java
  11. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  12. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  13. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  14. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherAttendanceService.java
  15. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  16. 117 42
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  17. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  18. 63 29
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  19. 13 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  20. 137 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  21. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  22. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAttendanceServiceImpl.java
  23. 99 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  24. 28 124
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  25. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  26. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CountVo.java
  27. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVo.java
  28. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java
  29. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  30. 15 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  31. 10 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  32. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MemberPriceSettingsMapper.xml
  33. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  34. 5 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  35. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml
  36. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java
  37. 29 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherAttendanceController.java
  38. 0 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  39. 3 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  40. 9 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

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

@@ -25,4 +25,11 @@ public interface TeacherFeignService {
     @GetMapping(value = "/task/opsCourseGroup")
     HttpResponseResult<Object> opsCourseGroup();
 
+    /**
+     * @Description: 课程提醒(每晚9点)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    @GetMapping("/task/courseRemind")
+    HttpResponseResult<Object> courseRemind();
 }

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

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

+ 21 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseRemindTask.java

@@ -0,0 +1,21 @@
+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;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/6
+ */
+public class CourseRemindTask extends BaseTask {
+
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.courseRemind();
+    }
+}

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
@@ -168,5 +169,11 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //根据订单号查询开课时间
     List<String> selectStartTime(String orderNo);
+
+    //查询明天有课的老师
+    List<SysUser> selectTeacher(String tomorrow);
+
+    //根据老师id统计明日课程
+    List<CountVo> selectTypeCount(@Param("teacherId")Long teacherId,@Param("tomorrow") String tomorrow);
 }
 

+ 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;
+    }
+
+}
+

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -46,6 +46,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     //------短信模板------
     SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
+    SMS_LIVE_BUY("SMS_LIVE_BUY","直播课购买"),
+    SMS_LIVE_COMPLETION_SUCCESS("SMS_LIVE_COMPLETION_SUCCESS","直播课成课"),
 
     SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱(短信)"),
 
@@ -59,7 +61,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     SMS_VIDEO_BUY("SMS_VIDEO_BUY","视频课购买(短信)"),
     SMS_STUDENT_BUY_PRACTICE("SMS_STUDENT_BUY_PRACTICE","学员购买陪练课(短信)"),
-    SMS_PRACTICE_BUY("SMS_PRACTICE_BUY", "陪练课购买(短信)");
+    SMS_PRACTICE_BUY("SMS_PRACTICE_BUY", "陪练课购买(短信)"),
+    SMS_TOMORROW_COURSE_REMINDER("SMS_TOMORROW_COURSE_REMINDER", "明日课程提醒(每晚9点)(短信)");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

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

@@ -220,5 +220,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      * @return 老师本周收到的评价
      */
     Integer getWeekStudentRepliedCourseSchedule(Long userId);
+
+    void courseRemind();
 }
 

+ 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();
+}
+

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -1,7 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+
+import java.util.Map;
 
 /**
  * 平台订单支付表 服务类
@@ -26,4 +31,41 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment detailByTransNo(String transNo);
+
+    /***
+     * 请求惠付接口后插入订单付款表
+     * @author liweifan
+     * @param: responseResult
+     * @param: payReq
+     * @updateTime 2022/5/6 15:13
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq);
+
+    /***
+     * 关闭付款单
+     * @author liweifan
+     * @param: orderNo
+     * @param: reason
+     * @updateTime 2022/5/6 14:49
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment closePayment(String orderNo,String reason);
+
+    /***
+     * 支付关单成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    void paymentCloseSucceededHandle(JSONObject hfRes);
+
+    /***
+     * 支付关单失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    void paymentCloseFailedHandle(JSONObject hfRes);
+
 }

+ 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;

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

@@ -176,4 +176,8 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     public IPage<MyRepliedVo> myReplied(IPage<MyRepliedVo> page, MyCourseSearch search) {
         return page.setRecords(repliedDao.myReplied(page, search));
     }
+
+    public void noRepliedTeacher(){
+
+    }
 }

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

@@ -269,6 +269,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 calendarEntity.setFullCourse(0);//  0:未满 1满
             } else {
                 //将日历时间与课程时间进行对比,如果有交集则将日历的时间数据删除
+                if (CollectionUtils.isEmpty(calendarEntity.getCourseTime())) {
+                    return;
+                }
                 Iterator<CourseTimeEntity> iterator = calendarEntity.getCourseTime().iterator();
                 while (iterator.hasNext()) {
                     CourseTimeEntity next = iterator.next();
@@ -344,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++;
@@ -487,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));
@@ -499,6 +500,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             times.add(courseTimeEntity);
         });
         entity.setCourseTime(times);
+        return entity;
     }
 
     /**
@@ -510,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);
@@ -647,7 +646,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 List<Long> userList = paymentDao.selectAll();
                 //取差集
                 userList.removeAll(studentList);
-                if (userList.isEmpty()) {
+                if (CollectionUtils.isEmpty(userList)) {
                     return page.setRecords(new ArrayList<>());
                 }
                 search.setRepliedIds(userList);
@@ -908,7 +907,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         log.info("buyPracticeCourseSuccess  param:{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
         List<CourseScheduleStudentPaymentVo> paymentList = paymentDao.selectPaymentList(orderNo);
-        if (paymentList.isEmpty()) {
+        if (CollectionUtils.isEmpty(paymentList)) {
             throw new BizException("订单不存在!");
         }
 
@@ -947,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("陪练课消息推送失败");
         }
     }
@@ -961,7 +960,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String orderNo = orderParam.getOrderNo();
         List<CourseScheduleStudentPayment> paymentList = paymentDao.selectList(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getOrderNo, orderNo));
-        if (paymentList.isEmpty()) {
+        if (CollectionUtils.isEmpty(paymentList)) {
             throw new BizException("订单不存在!");
         }
 
@@ -994,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;
@@ -1061,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) {
@@ -1095,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);
     }
 
     /**
@@ -1103,7 +1102,42 @@ 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)) {
+            for (SysUser sysUser : userList) {
+                Map<Long, String> teacherReceivers = new HashMap<>();
+                teacherReceivers.put(sysUser.getId(), sysUser.getPhone());
+                Map<Long, String> teacherSms = new HashMap<>();
+                teacherSms.put(sysUser.getId(), sysUser.getPhone());
+
+                Integer liveCount=0;
+                Integer practiceCount=0;
+                List<CountVo> typeCount=baseMapper.selectTypeCount(sysUser.getId(),tomorrow);
+                for (CountVo countVo : typeCount) {
+                    if (countVo.getType().equals(CourseScheduleEnum.LIVE.getCode())) {
+                        liveCount=countVo.getCount();
+                    }
+                    if (countVo.getType().equals(CourseScheduleEnum.PRACTICE.getCode())) {
+                        practiceCount=countVo.getCount();
+                    }
+                }
 
+                //老师端-明日课程提醒
+                String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                        practiceCount.toString(),liveCount.toString(),teacherUrl);
+                log.info("send success {}",MessageTypeEnum.TOMORROW_COURSE_REMINDER);
+
+                //老师端-明日课程提醒(短信)
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER,
+                        teacherSms, null, 0, null, null,
+                        practiceCount, liveCount);
+                log.info("send success {}",MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
+            }
+        }
     }
 }

+ 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", "05");
-        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));

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

@@ -61,7 +61,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         if (null == detail) {
             return HttpResponseResult.failed("未找到会员卡信息");
         }
-        //插入会员卡信息到会员卡记录表
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setBizId(detail.getId());

+ 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;
+    }
+
+}
+

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

@@ -1,16 +1,31 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
+import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.utils.string.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao;
 import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.Map;
+
 
 @Service
 public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao, UserOrderPayment> implements UserOrderPaymentService {
 
+    @Autowired
+    private PaymentSdk paymentSdk;
+
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo) {
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
@@ -22,4 +37,88 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getTransNo, transNo));
     }
+
+
+    @Override
+    public UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
+        UserOrderPayment orderPayment = new UserOrderPayment();
+        orderPayment.setOrderNo(payReq.getOrderNo());
+        orderPayment.setPayChannel(payReq.getPayChannel());
+        if (responseResult.getStatus()) {
+            Map<String, Object> res = responseResult.getData();
+            orderPayment.setTransNo(res.get("id").toString());
+            orderPayment.setPayAmt(
+                    new BigDecimal(res.get("pay_amt").toString()).setScale(2, RoundingMode.HALF_UP)
+            );
+            String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
+            orderPayment.setPayInfo(pay_info);
+            orderPayment.setStatus(TradeStatusEnum.pending);
+        } else {
+            orderPayment.setPayFailMsg(responseResult.getMsg());
+            orderPayment.setStatus(TradeStatusEnum.failed);
+        }
+        save(orderPayment);
+        return orderPayment;
+    }
+
+    @Override
+    public UserOrderPayment closePayment(String orderNo, String reason) {
+        UserOrderPayment orderPayment = detailByOrderNo(orderNo);
+        //未创建付款单,直接创建付款单
+        if(null == orderPayment){
+            orderPayment = new UserOrderPayment();
+            orderPayment.setOrderNo(orderNo);
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+            orderPayment.setUpdateTime(new Date());
+            save(orderPayment);
+            return orderPayment;
+        }
+        //更新
+        if (!TradeStatusEnum.pending.equals(orderPayment.getStatus())) {
+            return orderPayment;
+        }
+
+        //更新付款单
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+        orderPayment.setUpdateTime(new Date());
+
+        //发送支付关单请求
+        if(!StringUtil.isEmpty(orderPayment.getTransNo())){
+            HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(orderPayment.getTransNo(), reason, "");
+            if (!responseResult.getStatus()) {
+                orderPayment.setCloseStatus(TradeStatusEnum.failed);
+                orderPayment.setCloseFailMsg(responseResult.getMsg());
+            } else {
+                orderPayment.setCloseStatus(TradeStatusEnum.pending);
+            }
+        }
+        updateById(orderPayment);
+        return orderPayment;
+    }
+
+    @Override
+    public void paymentCloseSucceededHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
+
+
+    @Override
+    public void paymentCloseFailedHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
 }

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

@@ -171,8 +171,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         if (null == detail) {
             return HttpResponseResult.failed("未找到订单信息");
         }
-        if(!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
-            && !OrderStatusEnum.PAYING.equals(detail.getStatus())){
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单已完成");
         }
         if (!StringUtil.isEmpty(detail.getTransNo())) {
@@ -213,16 +213,16 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public void setOrderStatus(String orderNo, OrderStatusEnum orderStatus) {
         UserOrderVo detail = detail(orderNo);
-        if(OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
-            || OrderStatusEnum.PAYING.equals(detail.getStatus())){
+        if (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                || OrderStatusEnum.PAYING.equals(detail.getStatus())) {
 
-            if(OrderStatusEnum.CLOSE.equals(orderStatus)){
-                doOrderCancel(detail,orderStatus,"测试接口-订单关闭");
+            if (OrderStatusEnum.CLOSE.equals(orderStatus)) {
+                doOrderCancel(detail, orderStatus, "测试接口-订单关闭");
             }
-            if(OrderStatusEnum.FAIL.equals(orderStatus)){
-                doOrderCancel(detail,orderStatus,"测试接口-订单交易失败");
+            if (OrderStatusEnum.FAIL.equals(orderStatus)) {
+                doOrderCancel(detail, orderStatus, "测试接口-订单交易失败");
             }
-            if(OrderStatusEnum.PAID.equals(orderStatus)){
+            if (OrderStatusEnum.PAID.equals(orderStatus)) {
                 orderSuccess(detail);
             }
         }
@@ -315,7 +315,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo());
         if (OrderStatusEnum.PAYING.equals(detail.getStatus())) {
-            //处于付款中状态,需要拉起付款接口返回信息,并且去到汇付
             return orderPayPaying(payReq, detail);
         }
         return HttpResponseResult.failed("订单状态异常");
@@ -330,9 +329,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         } else if (type.equals("payment.failed")) {//支付失败
             paymentFailedHandle(hfRes);
         } else if (type.equals("payment.close.succeeded")) {//支付关单成功
-            paymentCloseSucceededHandle(hfRes);
+            orderPaymentService.paymentCloseSucceededHandle(hfRes);
         } else if (type.equals("payment.close.failed")) {//支付关单失败
-            paymentCloseFailedHandle(hfRes);
+            orderPaymentService.paymentCloseFailedHandle(hfRes);
         }
     }
 
@@ -378,39 +377,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         }
     }
 
-    /***
-     * 支付关单成功
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    private void paymentCloseSucceededHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
-        orderPayment.setUpdateTime(new Date());
-        orderPaymentService.updateById(orderPayment);
-    }
-
-    /***
-     * 支付关单失败
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    private void paymentCloseFailedHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setStatus(TradeStatusEnum.failed);
-        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
-        orderPayment.setUpdateTime(new Date());
-        orderPaymentService.updateById(orderPayment);
-    }
-
     @Override
     public void pollingOrder() {
         //查询半小时前创建的并且还未完成的订单 WAIT_PAY 待支付订单 PAYING 支付中订单
@@ -444,8 +410,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         if (null == detail) {
             return;
         }
-        if(!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
-                && !OrderStatusEnum.PAYING.equals(detail.getStatus())){
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return;
         }
         if (!StringUtil.isEmpty(detail.getTransNo())) {
@@ -476,6 +442,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes>
      */
     private HttpResponseResult<OrderPayRes> orderPayWaitPay(OrderPayReq payReq, UserOrderVo detail) {
+        OrderPayRes orderPayRes = new OrderPayRes();
+
+        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
+        if (null != orderPayment && TradeStatusEnum.pending.equals(orderPayment.getStatus())
+                && !StringUtil.isEmpty(orderPayment.getPayInfo())) {
+            orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
+            orderPayRes.setPay_info(orderPayment.getPayInfo());
+            orderPayRes.setPayChannel(orderPayment.getPayChannel());
+            return HttpResponseResult.succeed(orderPayRes);
+        }
+
         PaymentReq paymentReq = new PaymentReq();
         paymentReq.setOrder_no(payReq.getOrderNo());
         paymentReq.setPay_channel(payReq.getPayChannel().getCode());
@@ -503,76 +480,21 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //付款请求
         HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.executePayment(paymentReq);
         if (responseResult.getStatus()) {
-            OrderPayRes orderPayRes = new OrderPayRes();
             orderPayRes.setPay_amt(detail.getActualPrice().setScale(2, RoundingMode.HALF_UP).toString());
             String pay_info = ((JSONObject) responseResult.getData().get("expend")).getString("pay_info");
             orderPayRes.setPay_info(pay_info);
             orderPayRes.setPayChannel(payReq.getPayChannel());
 
             //入订单付款表,同时修改订单状态
-            insertOrderPayment(responseResult, payReq);
+            orderPaymentService.insertOrderPayment(responseResult, payReq);
+
             baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.PAYING.getCode());
             return HttpResponseResult.succeed(orderPayRes);
         } else {
             //入订单付款表,同时修改订单状态
-            doOrderCancel(detail, OrderStatusEnum.FAIL, "订单超时");
-            errOrderPayment(responseResult, payReq);
+            doOrderCancel(detail, OrderStatusEnum.FAIL, responseResult.getMsg());
             return HttpResponseResult.failed(responseResult.getMsg());
         }
-
-    }
-
-    /***
-     * 插入订单付款单
-     * @author liweifan
-     * @param: res
-     * @param: payReq
-     * @updateTime 2022/4/13 17:56
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    private UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
-        UserOrderPayment orderPayment = new UserOrderPayment();
-        orderPayment.setOrderNo(payReq.getOrderNo());
-        orderPayment.setPayChannel(payReq.getPayChannel());
-        if (responseResult.getStatus()) {
-            Map<String, Object> res = responseResult.getData();
-            orderPayment.setTransNo(res.get("id").toString());
-            orderPayment.setPayAmt(
-                    new BigDecimal(res.get("pay_amt").toString()).setScale(2, RoundingMode.HALF_UP)
-            );
-            String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
-            orderPayment.setPayInfo(pay_info);
-            orderPayment.setStatus(TradeStatusEnum.pending);
-        } else {
-            orderPayment.setPayFailMsg(responseResult.getMsg());
-            orderPayment.setStatus(TradeStatusEnum.failed);
-        }
-        orderPaymentService.save(orderPayment);
-        return orderPayment;
-    }
-
-    /***
-     * 处理付款请求失败
-     * @author liweifan
-     * @param: res
-     * @param: payReq
-     * @updateTime 2022/4/13 17:56
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    private UserOrderPayment errOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
-        //查询
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
-        if (null == orderPayment) {
-            orderPayment = new UserOrderPayment();
-            orderPayment.setOrderNo(payReq.getOrderNo());
-            orderPayment.setPayChannel(payReq.getPayChannel());
-        }
-        orderPayment.setPayFailMsg(responseResult.getMsg());
-        orderPayment.setStatus(TradeStatusEnum.failed);
-        orderPayment.setUpdateTime(new Date());
-
-        orderPaymentService.saveOrUpdate(orderPayment);
-        return orderPayment;
     }
 
     /***
@@ -779,25 +701,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setUpdateTime(new Date());
         baseMapper.updateById(userOrder);
 
-
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
-        if (null != orderPayment) {
-            //更新付款单
-            orderPayment.setStatus(TradeStatusEnum.failed);
-            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
-            orderPayment.setUpdateTime(new Date());
-        }
-        //发送支付关单请求
-        HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
-        if (!responseResult.getStatus()) {
-            orderPayment.setCloseStatus(TradeStatusEnum.failed);
-            orderPayment.setCloseFailMsg(responseResult.getMsg());
-            orderPaymentService.updateById(orderPayment);
-            return;
-        } else {
-            orderPayment.setCloseStatus(TradeStatusEnum.pending);
-            orderPaymentService.updateById(orderPayment);
-        }
+        orderPaymentService.closePayment(userOrder.getOrderNo(), reason);
     }
 
     void orderSuccess(UserOrderVo detail) {

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

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -208,7 +209,7 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         VideoLessonGroupSearch query = new VideoLessonGroupSearch();
         query.setGroupId(groupId);
         List<VideoLessonGroupVo> lessonGroup = videoLessonGroupDao.selectPage(null, query);
-        if (lessonGroup.isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonGroup)) {
             return lessonStudentVo;
         }
         lessonStudentVo.setLessonGroup(lessonGroup.get(0));

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CountVo.java

@@ -12,6 +12,15 @@ public class CountVo {
 
     @ApiModelProperty("数量")
     private Integer count;
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 
     public Integer getCount() {
         return count;

+ 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}

+ 15 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -600,4 +600,19 @@
         LEFT JOIN course_schedule s ON p.course_id_=s.id_
         WHERE p.order_no_=#{orderNo}
     </select>
+    <select id="selectTeacher" resultType="com.yonge.cooleshow.auth.api.entity.SysUser"
+            parameterType="java.lang.String">
+        SELECT s.teacher_id_ AS id,u.phone_ AS phone
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_=u.id_
+        WHERE class_date_=#{tomorrow} AND lock_=0
+        GROUP BY s.teacher_id_
+    </select>
+    <select id="selectTypeCount" resultType="com.yonge.cooleshow.biz.dal.vo.CountVo">
+        SELECT type_ AS type, COUNT(1) AS count
+        FROM course_schedule
+        WHERE class_date_=#{tomorrow}
+        AND teacher_id_=#{teacherId} AND lock_=0
+        GROUP BY type_
+    </select>
 </mapper>

+ 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'

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MemberPriceSettingsMapper.xml

@@ -29,6 +29,7 @@
 			<include refid="baseColumns"/>,
 			ifnull(u.real_name_,u.username_) modifierName
 		FROM member_price_settings t
+		LEFT JOIN sys_user u on t.update_by_ = u.id_
 		where t.id_ = #{id}
 	</select>
 

+ 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>

+ 5 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml

@@ -195,7 +195,7 @@
 			p.purchase_time_ AS purchaseTime
 		FROM video_lesson_purchase_record p
 		LEFT JOIN sys_user u ON p.student_id_ = u.id_
-		<where>
+		WHERE p.order_status_='PAID'
 			<if test="param.videoLessonGroupId !=null">
 				AND p.video_lesson_group_id_ = #{param.videoLessonGroupId}
 			</if>
@@ -215,7 +215,6 @@
 			<if test="param.endTime !=null">
 				<![CDATA[AND p.purchase_time_ <= #{param.endTime} ]]>
 			</if>
-		</where>
 	</select>
 	<select id="selectLessonGroup" resultType="com.yonge.cooleshow.biz.dal.vo.LessonGroupVo">
 		SELECT
@@ -249,6 +248,9 @@
 				g.id_ IN
 				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_='PAID')
 			</if>
+			<if	test="param.teacherId != null">
+				AND g.teacher_id_ = #{param.teacherId}
+			</if>
 		</where>
 		ORDER BY g.create_time_ DESC
 	</select>
@@ -290,5 +292,6 @@
 				<![CDATA[AND g.create_time_ <= #{param.endTime} ]]>
 			</if>
 		</where>
+		ORDER BY g.create_time_ DESC
 	</select>
 </mapper>

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

@@ -43,7 +43,10 @@
         select
             <include refid="baseColumns"/>,
             u.phone_ as phone
-        from vip_card_record t
+        from (
+            select max(id_) as id_ from vip_card_record group by user_id_
+        ) a
+        left join vip_card_record t on a.id_ = t.id_
         left join sys_user u on t.user_id_ = u.id_
         where t.end_time_ &gt;= now()
         and t.end_time_ &lt; DATE_ADD(now(),INTERVAL 3 DAY)

+ 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));
     }
 

+ 3 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.vo.VideoLessonVo;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -115,7 +116,7 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (lessonVo.getLessonList().isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
         videoLessonGroupService.add(lessonVo,sysUser);
@@ -146,7 +147,7 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (lessonVo.getLessonList().isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
         videoLessonGroupService.update(lessonVo,sysUser);

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.teacher.task;
 
 import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -23,6 +24,8 @@ public class TaskController extends BaseController {
     private TeacherTotalService teacherTotalService;
     @Autowired
     private CourseGroupService courseGroupService;
+    @Autowired
+    private CourseScheduleService scheduleService;
 
     /***
      * 查询所有老师统计数据
@@ -49,4 +52,10 @@ public class TaskController extends BaseController {
     public HttpResponseResult<Object> getRedisValueByKey(String key) {
         return succeed(teacherTotalService.getRedisValueByKey(key));
     }
+
+    @GetMapping("/courseRemind")
+    public HttpResponseResult<Object> courseRemind() {
+        scheduleService.courseRemind();
+        return HttpResponseResult.succeed();
+    }
 }