瀏覽代碼

merge:解决冲突

liujunchi 3 年之前
父節點
當前提交
ae144729a0
共有 32 個文件被更改,包括 814 次插入136 次删除
  1. 0 5
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderController.java
  2. 10 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java
  3. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java
  4. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  5. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java
  6. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java
  7. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  8. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  9. 70 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PracticeTeacherSearch.java
  10. 38 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherSalary.java
  11. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherSalaryEnum.java
  12. 24 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  13. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  14. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  15. 145 32
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  16. 50 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  17. 1 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  18. 8 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  19. 15 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  20. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  21. 146 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PracticeTeacherVo.java
  22. 28 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  23. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonExamineVo.java
  24. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  25. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  26. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CoursePlanMapper.xml
  27. 80 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  28. 13 10
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  29. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  30. 21 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java
  31. 0 4
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java
  32. 11 6
      toolset/utils/src/main/java/com/yonge/toolset/utils/easyexcel/ExcelDataReader.java

+ 0 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderController.java

@@ -9,17 +9,12 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.easyexcel.ExcelUtils;
-import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.*;
 import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
-import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 
 import java.lang.reflect.InvocationTargetException;

+ 10 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java

@@ -8,9 +8,7 @@ import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.SelectGroup;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentDetailVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonTeacherVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -35,6 +33,15 @@ public class VideoLessonController extends BaseController {
     private VideoLessonGroupService lessonGroupService;
     @Autowired
     private VideoLessonGroupDetailService videoLessonGroupDetailService;
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    @ApiOperation(value = "修改视频课组审核状态", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/updateGroup", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> update(@Validated @RequestBody VideoLessonExamineVo examineVo) {
+        videoLessonGroupService.updateGroup(examineVo);
+        return succeed();
+    }
 
     @ApiOperation(value = "根据视频课组id查详情")
     @GetMapping(value = "/selectGroupById")

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

@@ -67,6 +67,13 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
     List<LiveCourseGroupPlanVo> selectAdminLivePlan(@Param("courseGroupId") Long courseGroupId);
 
     /**
+     * 课程组人数增加或减少
+     *
+     * @param id 课程组id
+     */
+    int opsPreStudentNum(@Param("id") Long id,@Param("num") Integer num);
+
+    /**
      * 查询课程组详情
      *
      * @param courseGroupId 课程组id

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -92,5 +93,11 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //老师端-课表-日历-用户
     List<CourseStudent> queryCourseUser(@Param("param") MyCourseSearch search);
+
+    //学生端-首页-陪练课老师列表
+    List<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, @Param("param") PracticeTeacherSearch search);
+
+    //学生端-课表-日历-用户
+    List<CourseStudent> queryCourseTeacher(@Param("param") MyCourseSearch search);
 }
 

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java

@@ -22,6 +22,7 @@ public interface VideoLessonGroupDao extends BaseMapper<VideoLessonGroup> {
 
     //修改视频课组
     void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo);
+    void updateExamine(VideoLessonExamineVo examineVo);
 
     //学员详情-查询视频课列表
     List<VideoLessonStudentDetailVo> selectStudentPage(IPage page, @Param("param") VideoLessonSearch videoLessonSearch);

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

@@ -59,6 +59,10 @@ public class LiveCourseGroupDto implements Serializable {
     @ApiModelProperty(value = "课程组售卖开始日期")
     private Date salesStartDate;
 
+    @NotNull(message = "第一堂课开始时间不能为空")
+    @ApiModelProperty(value = "第一堂课开始时间")
+    private Date startTime;
+
     @NotNull(message = "课程组售卖结束日期不能为空")
     @ApiModelProperty(value = "课程组售卖结束日期")
     private Date salesEndDate;
@@ -176,6 +180,14 @@ public class LiveCourseGroupDto implements Serializable {
         this.salesStartDate = salesStartDate;
     }
 
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
     public Date getSalesEndDate() {
         return salesEndDate;
     }

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -32,13 +32,15 @@ public class OrderReq {
     private String userNote;
     @ApiModelProperty(value = "优惠券id")
     private Long couponId;
+    @NotNull(message = "订单金额不能为空")
     @ApiModelProperty(value = "订单金额", required = true)
     private BigDecimal actualPrice;
+    @NotNull(message = "商品详情不能为空")
     @ApiModelProperty(value = "业务请求详情", required = true)
     private List<OrderReqInfo> orderInfos;
 
     @ApiModel(value = "OrderReqInfo", description = "下单请求业务详情对象")
-    public class OrderReqInfo {
+    public static class OrderReqInfo {
         private Long userId;
         @NotNull(message = "商品类型不能为空")
         @ApiModelProperty(value = "商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ", required = true)

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

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

+ 70 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PracticeTeacherSearch.java

@@ -0,0 +1,70 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/19
+ */
+@ApiModel(value = "PracticeTeacherSearch")
+public class PracticeTeacherSearch extends QueryInfo {
+    @ApiModelProperty(value = "声部id")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "老师名称")
+    private String search;
+
+    @ApiModelProperty(value = "排序字段(starGrade,expTime,subjectPrice)")
+    private String sortField;
+
+    @ApiModelProperty(value = "排序规则(升序:ASC 降序:DESC)")
+    private String collation;
+
+    private String sort;
+
+    @Override
+    public String getSort() {
+        return sort;
+    }
+
+    @Override
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public String getSortField() {
+        return sortField;
+    }
+
+    public void setSortField(String sortField) {
+        this.sortField = sortField;
+    }
+
+    public String getCollation() {
+        return collation;
+    }
+
+    public void setCollation(String collation) {
+        this.collation = collation;
+    }
+}

+ 38 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherSalary.java

@@ -25,9 +25,13 @@ public class CourseScheduleTeacherSalary implements Serializable {
     private Long id;
 
     @TableField("teacher_id_")
-    @ApiModelProperty(value = "老师编号;")
+    @ApiModelProperty(value = "老师编号")
     private Long teacherId;
 
+    @TableField("student_id_")
+    @ApiModelProperty(value = "学生编号")
+    private Long studentId;
+
     @TableField("course_schedule_id_")
     @ApiModelProperty(value = "课程编号")
     private Long courseScheduleId;
@@ -38,7 +42,11 @@ public class CourseScheduleTeacherSalary implements Serializable {
 
     @TableField("course_group_id_")
     @ApiModelProperty(value = "课程组编号")
-    private String courseGroupId;
+    private Long courseGroupId;
+
+    @TableField("class_num_")
+    @ApiModelProperty(value = "课堂数")
+    private Integer classNum;
 
     @TableField("expect_salary_")
     @ApiModelProperty(value = "预计薪水")
@@ -68,6 +76,9 @@ public class CourseScheduleTeacherSalary implements Serializable {
     @ApiModelProperty(value = "修改时间")
     private Date updateTime;
 
+    @TableField("status_")
+    @ApiModelProperty(value = "TeacherSalaryEnum 未上课、待结算、已结算、已取消 ")
+    private String status;
 
     public Long getId() {
         return id;
@@ -85,6 +96,14 @@ public class CourseScheduleTeacherSalary implements Serializable {
         this.teacherId = teacherId;
     }
 
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
     public Long getCourseScheduleId() {
         return courseScheduleId;
     }
@@ -101,14 +120,22 @@ public class CourseScheduleTeacherSalary implements Serializable {
         this.courseGroupType = courseGroupType;
     }
 
-    public String getCourseGroupId() {
+    public Long getCourseGroupId() {
         return courseGroupId;
     }
 
-    public void setCourseGroupId(String courseGroupId) {
+    public void setCourseGroupId(Long courseGroupId) {
         this.courseGroupId = courseGroupId;
     }
 
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
     public BigDecimal getExpectSalary() {
         return expectSalary;
     }
@@ -165,5 +192,12 @@ public class CourseScheduleTeacherSalary implements Serializable {
         this.updateTime = updateTime;
     }
 
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
 }
 

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherSalaryEnum.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
+/**
+ * 课酬结算状态枚举
+ */
+public enum TeacherSalaryEnum implements BaseEnum<String, TeacherSalaryEnum> {
+    //未上课-还未开始上课等待上课结束后结算
+    NOT_START("NOT_START", "未上课"),
+    //待结算-老师上完课等待结算
+    WAIT("WAIT", "待结算"),
+    //已结算-已经结算完成
+    COMPLETE("COMPLETE", "已结算"),
+    //已取消-学生发起退款等等其他操作
+    CANCEL("CANCEL", "已取消");
+
+    @EnumValue
+    private String code;
+
+    private String msg;
+
+    TeacherSalaryEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+}

+ 24 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -5,14 +5,18 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
 import org.redisson.api.RMap;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -68,7 +72,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
     /**
      * 平台方 老师详情直播课列表
      *
-     * @param page 分页
+     * @param page  分页
      * @param query 查询条件
      * @return page
      */
@@ -77,7 +81,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
     /**
      * 课程详情 购买学生
      *
-     * @param page 分页
+     * @param page  分页
      * @param query 查询条件
      * @return page
      */
@@ -107,7 +111,23 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @param query 查询条件
      * @return
      */
-    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(IPage<LiveCourseGroupStudentCourseVo> page,
-                                                                           LiveCourseGroupStudentCourseSearch query);
+    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(IPage<LiveCourseGroupStudentCourseVo> page, LiveCourseGroupStudentCourseSearch query);
+
+    /**
+     * 学生购买直播课程组
+     *
+     * @param orderReqInfo 订单信息
+     */
+    HttpResponseResult<OrderCreateRes> buyLiveCourse(OrderReq.OrderReqInfo orderReqInfo);
+
+    /**
+     * 待订单创建完毕后继续后续操作
+     *
+     * @param afterParam 传入参数
+     *                   <p> - courseList    课程列表
+     *                   <p> - studentId    学员id
+     *                   <p> - courseGroup   直播课程组信息
+     */
+    void buyLiveCourseAfter(UserOrderDetailVo afterParam);
 }
 

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

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.page.PageInfo;
 
@@ -179,5 +181,9 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     boolean checkStudentCourseSchedule(Long studentId, Long courseId);
 
     Map<String,Object> queryCourseUser(MyCourseSearch search);
+
+    IPage<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, PracticeTeacherSearch search);
+
+    Map<String,Object> queryCourseTeacher(MyCourseSearch search);
 }
 

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

@@ -22,6 +22,8 @@ public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
 
     void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo);
 
+    void updateGroup(VideoLessonExamineVo examineVo);
+
     void deleteGroup(Long id);
 
     void add(VideoLessonVo lessonVo, SysUser sysUser);

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

@@ -1,6 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
-import java.math.BigDecimal;
-import java.util.Date;
+
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -14,20 +14,24 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+
 import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+
+import com.yonge.cooleshow.biz.dal.enums.TeacherSalaryEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
-import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
-import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
-import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -40,13 +44,15 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import rx.subjects.Subject;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -78,6 +84,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
     private TeacherFreeTimeService teacherFreeTimeService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
 
     @Override
     public CourseGroupDao getDao() {
@@ -171,6 +179,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         group.setCourseIntroduce(dto.getCourseIntroduce());
         group.setCoursePrice(dto.getCoursePrice());
         group.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+        group.setCourseStartTime(dto.getStartTime());
         group.setSalesStartDate(dto.getSalesStartDate());
         group.setSalesEndDate(dto.getSalesEndDate());
         group.setBackgroundPic(dto.getBackgroundPic());
@@ -193,6 +202,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             course.setEndTime(o.getEndTime());
             course.setCreatedBy(dto.getTeacherId());
             course.setCreatedTime(now);
+            course.setLock(0);
             course.setStatus(CourseScheduleEnum.NOT_START.getCode());
             courseList.add(course);
 
@@ -475,7 +485,6 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     @Override
     public List<LiveCourseGroupPlanVo> selectAdminLivePlan(Long courseGroupId) {
-
         return baseMapper.selectAdminLivePlan(courseGroupId);
     }
 
@@ -508,69 +517,173 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     /**
      * 学生购买直播课程组
      *
-     * @param param 传入参数
-     *              <p> - groupId    直播课程组id
-     *              <p> - studentId    学员id
+     * @param orderReqInfo 订单信息
      */
-    public void buyLiveCourse(Map<String, Object> param) {
-        Long studentId = WrapperUtil.toLong(param, "studentId", "学员id不能为空!");
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public HttpResponseResult<OrderCreateRes> buyLiveCourse(OrderReq.OrderReqInfo orderReqInfo) {
+        Map<String, Object> param = WrapperUtil.toMap(orderReqInfo.getBizContent());
         Long groupId = WrapperUtil.toLong(param, "groupId", "课程组id不能为空!");
-        //学生信息
+        Long studentId = orderReqInfo.getUserId();
+        //校验学生信息
         getSysUser(studentId);
         //课程组信息
-        CourseGroup liveCourseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
+        CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getId, groupId)
                 .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
         );
-        if (Objects.isNull(liveCourseGroup)) {
+        if (Objects.isNull(courseGroup)) {
             throw new BizException("课程组不存在!");
         }
         //课程信息
         List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
-                .eq(CourseSchedule::getCourseGroupId, groupId)
-        );
+                .eq(CourseSchedule::getCourseGroupId, groupId));
         if (CollectionUtils.isEmpty(courseList)) {
             throw new BizException("课程组课程不存在!");
         }
         //校验购买的课程组每节课时间是否和自己的课时冲突
         batchCheckStudentCourseTime(studentId, courseList, CourseSchedule::getStartTime, CourseSchedule::getEndTime);
-        //todo 写订单 返回订单号数据(订单号 金额 等等)
-        String orderNo = "";
-        Date now = new Date();
+        //返回的数据 有用后面aftet的方法使用
+        Map<String, Object> bizContent = new HashMap<>();
+        bizContent.put("courseGroup", courseGroup);
+        bizContent.put("courseList", courseList);
+        bizContent.put("studentId", studentId);
+        OrderCreateRes orderCreateRes = new OrderCreateRes();
+        orderCreateRes.setRes(true);
+        orderCreateRes.setMerchId(courseGroup.getTeacherId());
+        orderCreateRes.setBizId(courseGroup.getId());
+        orderCreateRes.setOriginalPrice(courseGroup.getCoursePrice());
+        orderCreateRes.setExpectPrice(courseGroup.getCoursePrice());
+        orderCreateRes.setBizParam(bizContent);
+        orderCreateRes.setGoodNum(courseGroup.getCourseNum());
+        orderCreateRes.setGoodType(GoodTypeEnum.LIVE);
+
+        HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
+        httpResponseResult.setData(orderCreateRes);
+        return httpResponseResult;
+    }
+
+    /**
+     * 待订单创建完毕后继续后续操作
+     *
+     * @param afterParam 传入参数
+     *                   <p> - courseList    课程列表
+     *                   <p> - studentId    学员id
+     *                   <p> - courseGroup   直播课程组信息
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void buyLiveCourseAfter(UserOrderDetailVo afterParam) {
+        Map<String, Object> param = WrapperUtil.toMap(afterParam.getBizParam());
+        String orderNo = afterParam.getOrderNo();
+        Long studentId = (Long) param.get("studentId");
+        List<CourseSchedule> courseList = (List<CourseSchedule>) param.get("courseList");
+        CourseGroup courseGroup = (CourseGroup) param.get("courseGroup");
+
         //写course_schedule_student_payment表 作为记录锁定时间用,防止重复购买,如果支付失败则删除该数据
         List<CourseScheduleStudentPayment> studentPaymentList = new ArrayList<>();
+        Date now = new Date();
         courseList.forEach(course -> {
             CourseScheduleStudentPayment studentPayment = new CourseScheduleStudentPayment();
             studentPayment.setUserId(studentId);
-            studentPayment.setCourseGroupId(groupId);
+            studentPayment.setCourseGroupId(courseGroup.getId());
             studentPayment.setCourseId(course.getId());
             studentPayment.setOrderNo(orderNo);
-            studentPayment.setOriginalPrice(liveCourseGroup.getCoursePrice());
-            studentPayment.setExpectPrice(liveCourseGroup.getCoursePrice());
-            studentPayment.setActualPrice(liveCourseGroup.getCoursePrice());
+            studentPayment.setOriginalPrice(courseGroup.getCoursePrice());
+            studentPayment.setExpectPrice(courseGroup.getCoursePrice());
+            studentPayment.setActualPrice(courseGroup.getCoursePrice());
             studentPayment.setCreatedTime(now);
             studentPayment.setUpdatedTime(now);
-            studentPayment.setCourseType(liveCourseGroup.getType());
+            studentPayment.setCourseType(courseGroup.getType());
             studentPaymentList.add(studentPayment);
         });
         courseScheduleStudentPaymentService.getDao().insertBatch(studentPaymentList);
     }
 
     /**
-     * 学生购买直播课程成功-回调成功
+     * 学生购买直播课程-成功-回调
      */
-    public void buyLiveCourseSuccess() {
-        //写course_group表 pre_student_num_(预计上课人数) +1
+    @Transactional(rollbackFor = Exception.class)
+    public void buyLiveCourseSuccess(String orderNo) {
+        //更新课程组的购买人数+1
+        CourseScheduleStudentPayment studentPayment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
+        );
+        if (Objects.isNull(studentPayment)) {
+            throw new BizException("订单不存在!");
+        }
+        //更新课程组的购买人数+1
+        this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
+        //课程组信息
+        CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
+                .eq(CourseGroup::getId, studentPayment.getCourseGroupId()));
+        //课程信息
+        List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
+        //计算课程组单节课价格 取CourseScheduleStudentPayment expectPrice
+        BigDecimal expectPrice = studentPayment.getExpectPrice();
+        //查询直播课服务费
+        String liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
+        BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        //获取每节课的课酬 key 课堂数  value 课酬
+        Map<Integer, BigDecimal> singerCourseSalary = getSingerCourseSalary(expectPrice, courseGroup.getCourseNum(), liveServiceRate);
         //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
-        //修改订单为成功
+        Date now = new Date();
+        List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
+        courseList.forEach(course -> {
+            CourseScheduleTeacherSalary teacherSalary = new CourseScheduleTeacherSalary();
+            teacherSalary.setTeacherId(course.getTeacherId());
+            teacherSalary.setStudentId(course.getTeacherId());
+            teacherSalary.setCourseScheduleId(course.getId());
+            teacherSalary.setCourseGroupType(course.getType());
+            teacherSalary.setCourseGroupId(course.getCourseGroupId());
+            teacherSalary.setClassNum(course.getClassNum());
+            teacherSalary.setExpectSalary(singerCourseSalary.get(course.getClassNum()));
+            teacherSalary.setReduceSalary(BigDecimal.ZERO);
+            teacherSalary.setCreateTime(now);
+            teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
+            teacherSalaryList.add(teacherSalary);
+        });
+        courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
     }
 
     /**
-     * 学生购买直播课失败-回调
+     * 学生购买直播课程,计算每节课课酬
+     *
+     * @param totalPrice     课酬总金额
+     * @param totalCourseNum 课程总数
+     * @param rate           课酬费率
+     * @return key 课堂数  value 课酬
+     */
+    private Map<Integer, BigDecimal> getSingerCourseSalary(BigDecimal totalPrice, Integer totalCourseNum, BigDecimal rate) {
+        //1 - (1 * 手续费率)
+        BiFunction<BigDecimal, BigDecimal, BigDecimal> getPrice = (p, r) -> p.subtract(p.multiply(r)).setScale(2, RoundingMode.HALF_UP);
+        //总课酬
+        BigDecimal totalRatePrice = getPrice.apply(totalPrice, rate);
+        //每节课累计总额
+        BigDecimal cumulativeAmount = BigDecimal.ZERO;
+        //每节课的课酬
+        BigDecimal singerSalary = totalRatePrice.divide(BigDecimal.valueOf(totalCourseNum), 2, RoundingMode.HALF_UP);
+        Map<Integer, BigDecimal> map = new HashMap<>();
+        for (int i = 1; i <= totalCourseNum; i++) {
+            //最后一节课,直接用总课酬减去累计课酬
+            if (i == totalCourseNum) {
+                singerSalary = totalRatePrice.subtract(cumulativeAmount);
+            }
+            cumulativeAmount = cumulativeAmount.add(singerSalary);
+            map.put(i, singerSalary);
+        }
+        return map;
+    }
+
+    /**
+     * 学生购买直播课-失败-回调
      */
-    public void buyLiveCourseFailed() {
-        //修改 course_group表 pre_student_num_(预计上课人数) - 1
+    @Transactional(rollbackFor = Exception.class)
+    public void buyLiveCourseFailed(String orderNo) {
         //删除 course_schedule_student_payment表 数据
+
+
         //修改订单为失败
     }
 

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

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -19,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.exception.BizException;
@@ -247,7 +249,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      *              <p> - teacherId 老师id
      *              <p> - year 年
      *              <p> - month 月
-     *              <p> - day 日
      *              <p> - singleCourseMinutes 单课时时长(包含休息时间)
      * @return 返回传入时间当月每日的剩余时间段
      */
@@ -256,13 +257,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Long teacherId = WrapperUtil.toLong(param, "teacherId", "老师id不能为空!");
         Integer year = WrapperUtil.toInt(param, "year", "日历的时间年份不能为空!");
         Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
-        Integer day = WrapperUtil.toInt(param, "month", "日历的时间日期不能为空!");
         Integer singleCourseMinutes = WrapperUtil.toInt(param, "singleCourseMinutes", "单课时时长不能为空!");
         if (singleCourseMinutes < 25) {
             throw new BizException("单课时时长不能小于25分钟!");
         }
-        //传入的日期+1天开始
-        LocalDate firstDay = LocalDate.of(year, month, day).plusDays(1L);
+        //获取每月1号
+        LocalDate firstDay = LocalDate.of(year, month, 1);
         //根据firstDay计算出该月的最后一天
         LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
         //获取老师的课程  key:日期-年月日 value:课程时间-开始时间,结束时间
@@ -435,19 +435,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      *              <p> - studentId 学生id
      *              <p> - year 年
      *              <p> - month 月
-     *              <p> - day 日
      * @return 返回传入时间当月每日的剩余时间段
      */
     public List<CourseCalendarEntity> createPracticeCourseCalender(Map<String, Object> param) {
         //校验数据
         Long teacherId = WrapperUtil.toLong(param, "teacherId", "老师id不能为空!");
-        Long studentId = WrapperUtil.toLong(param, "teacherId", "学生id不能为空!");
+        Long studentId = WrapperUtil.toLong(param, "studentId", "学生id不能为空!");
         Integer year = WrapperUtil.toInt(param, "year", "日历的时间年份不能为空!");
         Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
-        Integer day = WrapperUtil.toInt(param, "month", "日历的时间日期不能为空!");
 
-        //传入的日期+1天开始
-        LocalDate firstDay = LocalDate.of(year, month, day).plusDays(1L);
+        //获取开始日期
+        LocalDate firstDay = LocalDate.of(year, month, 1);
         //根据firstDay计算出该月的最后一天
         LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
         //查询老师陪练课设置
@@ -680,6 +678,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      */
     public MyCourseSearch monthToDate(MyCourseSearch search) {
         String classMonth = search.getClassMonth();
+        if (StringUtils.isBlank(classMonth)){
+            return search;
+        }
         String[] classDateSp = classMonth.split("-");
         LocalDate firstDay;
         try {
@@ -759,5 +760,45 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         map.put("studentList",studentList);
         return map;
     }
+
+    /**
+     * @Description: 学生端-首页-陪练课老师列表
+     * @Author: cy
+     * @Date: 2022/4/19
+     */
+    @Override
+    public IPage<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, PracticeTeacherSearch search) {
+        String collation = search.getCollation();//排序规则
+        String sortField = search.getSortField();//排序字段
+        if (StringUtils.isNotBlank(sortField)){
+            if (StringUtils.isNotBlank(collation)){
+                search.setSort(sortField+" "+collation);
+            }else search.setSort(sortField);
+        }
+        return page.setRecords(baseMapper.teacherList(page, search));
+    }
+
+    /**
+     * @Description: 学生端-课表-日历-用户
+     * @Author: cy
+     * @Date: 2022/4/20
+     */
+    public Map<String,Object> queryCourseTeacher(MyCourseSearch search) {
+        List<CourseStudent> teacherList=baseMapper.queryCourseTeacher(search);
+        Map<String, String> sysConfig = new HashMap<>();
+        //提前XX分钟创建/进入陪练课房间时间
+        sysConfig.put("practiceStartTime",sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE));
+        //陪练课结束后,XX分钟关闭房间
+        sysConfig.put("practiceEndTime",sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
+        //提前XX分钟创建/进入直播房间的时间
+        sysConfig.put("liveStartTime",sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
+        //直播结束后,XX分钟关闭房间
+        sysConfig.put("liveEndTime",sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+
+        Map map=new HashMap();
+        map.put("sysConfig",sysConfig);
+        map.put("studentList",teacherList);
+        return map;
+    }
 }
 

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

@@ -4,12 +4,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleTeacherSalaryDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherSalaryService;
-import org.springframework.stereotype.Service;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import java.util.List;
+import org.springframework.stereotype.Service;
 
 /**
  * 老师课酬表(CourseScheduleTeacherSalary)表服务实现类

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

@@ -477,27 +477,14 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public Map<String, Object> test(String roomUid) {
         //result
         Map<String, Object> result = new HashMap<>();
-        //模拟排课数据 测试用
-        CheckCourseTimeDto dto = new CheckCourseTimeDto();
-        dto.setTeacherId(99L);
-        dto.setCourseNum(6);
-        dto.setLoop(1);
-
-        List<CourseTimeEntity> timeList = new ArrayList<>();
-        CourseTimeEntity c1 = new CourseTimeEntity();
-        c1.setStartTime(DateUtil.stringToDate("2022-04-01 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        c1.setEndTime(DateUtil.stringToDate("2022-04-01 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        CourseTimeEntity c2 = new CourseTimeEntity();
-        c2.setStartTime(DateUtil.stringToDate("2022-04-08 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        c2.setEndTime(DateUtil.stringToDate("2022-04-08 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        CourseTimeEntity c3 = new CourseTimeEntity();
-        c3.setStartTime(DateUtil.stringToDate("2022-04-02 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        c3.setEndTime(DateUtil.stringToDate("2022-04-02 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
-        timeList.add(c3);
-        timeList.add(c1);
-        timeList.add(c2);
-        dto.setTimeList(timeList);
-        List<CourseTimeEntity> courseTimeEntities = courseGroupService.lockCourseToCache(dto);
+        //{"day":"01","month":"05","year":"2022","singleCourseMinutes":60,"teacherId":4}
+        Map<String, Object> param = new HashMap<>();
+        param.put("day", "01");
+        param.put("month", "05");
+        param.put("year", "2022");
+        param.put("singleCourseMinutes", 60);
+        param.put("teacherId", 4);
+        List<CourseCalendarEntity> courseTimeEntities =  courseScheduleService.createLiveCourseCalendar(param);
         result.put("自动生成课时", courseTimeEntities);
 
         //获取房间信息

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

@@ -33,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -54,13 +55,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     private PaymentSdk paymentSdk;
     @Autowired
     private IdGeneratorService idGeneratorService;
+    @Autowired
+    private CourseGroupService courseGroupService;
 
     //验证订单是否可以下单
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
     private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderAfter = new HashMap<>();
 
-
     //订单完成后执行
     private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderSuccess = new HashMap<>();
     //订单取消后执行
@@ -71,9 +73,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         /**********订单生成前******************/
         //vip开通缴费
         orderCreate.put(GoodTypeEnum.VIP, vipCardService::orderCreate);
+        //直播课程购买
+        orderCreate.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourse);
 
         /**********订单生成后******************/
-        //orderAfter.put(OrderTypeEnum.VIP, vipCardService::orderAfter);
+        //直播课程购买after
+        orderAfter.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseAfter);
 
         /**********订单完成后******************/
         //vip开通缴费
@@ -136,10 +141,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
         //验证成功后,订单入库
         UserOrderVo orderVo = insertOrder(orderReq, resList);
-
         List<UserOrderDetailVo> orderDetailList = orderVo.getOrderDetailList();
-
-        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+        for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(orderReq.getUserId());
             orderDetailVo.setOrderId(orderVo.getId());
 
@@ -269,7 +272,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         PaymentReq paymentReq = new PaymentReq();
         paymentReq.setOrder_no(payReq.getOrderNo());
         paymentReq.setPay_channel(payReq.getPayChannel().getCode());
-        paymentReq.setPay_amt(detail.getActualPrice().setScale(2).toString());
+        paymentReq.setPay_amt(detail.getActualPrice().setScale(2, RoundingMode.HALF_UP).toString());
         paymentReq.setGoods_title(detail.getOrderName());
         paymentReq.setGoods_desc(detail.getOrderDesc());
 
@@ -365,8 +368,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     private UserOrderVo insertOrder(OrderReq orderReq, List<OrderCreateRes> resList) {
         UserOrder userOrder = new UserOrder();
         //订单号生成
-        Long orderNo = idGeneratorService.generatorId("userOrder");
-        userOrder.setOrderNo(orderNo.toString());
+        long orderNo = idGeneratorService.generatorId("userOrder");
+        userOrder.setOrderNo(Long.toString(orderNo));
         userOrder.setUserId(orderReq.getUserId());
         userOrder.setOrderName(orderReq.getOrderName());
         userOrder.setOrderType(orderReq.getOrderType());
@@ -395,9 +398,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             );
             //平台服务费
             BigDecimal serviceFeeRate = getServiceFeeRate(res.getGoodType());
-            orderDetail.setPlantformFee(userOrder.getActualPrice().multiply(serviceFeeRate));
+            orderDetail.setPlantformFee(userOrder.getExpectPrice().multiply(serviceFeeRate));
             orderDetail.setPlantformFeeRate(serviceFeeRate);
-
+            orderDetail.setBizParam(res.getBizParam());
             orderDetail.setCreateTime(new Date());
             orderDetailService.save(orderDetail);
             orderDetailList.add(orderDetail);
@@ -482,7 +485,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPaymentService.updateById(orderPayment);
         }
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
-        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+        for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(userOrder.getUserId());
             orderDetailVo.setOrderId(userOrder.getId());
             //调用业务
@@ -525,7 +528,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderPaymentService.updateById(orderPayment);
 
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
-        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+        for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(detail.getUserId());
             orderDetailVo.setOrderId(detail.getId());
             //调用业务

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

@@ -78,6 +78,12 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         videoLessonGroupDao.updateGroup(lessonGroupUpVo);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateGroup(VideoLessonExamineVo examineVo) {
+        videoLessonGroupDao.updateExamine(examineVo);
+    }
+
     /**
      * @Description: 删除视频课
      * @Author: cy

+ 146 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PracticeTeacherVo.java

@@ -0,0 +1,146 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/19
+ */
+@ApiModel(value = "PracticeTeacherVo")
+public class PracticeTeacherVo implements Serializable {
+    @ApiModelProperty(value = "老师id")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "用户姓名")
+    private String userName;
+
+    @ApiModelProperty(value = "头像地址")
+    private String avatar;
+
+    @ApiModelProperty(value = "星级")
+    private String starGrade;
+
+    @ApiModelProperty(value = "已上课时")
+    private String expTime;
+
+    @ApiModelProperty(value = "毕业学校")
+    private String school;
+
+    @ApiModelProperty(value = "学校专业")
+    private String schoolSubject;
+
+    @ApiModelProperty(value = "设置的声部")
+    private String configSubject;
+
+    @ApiModelProperty(value = "声部id")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectName;
+
+    @ApiModelProperty(value = "声部价格")
+    private String subjectPrice;
+
+    @ApiModelProperty(value = "课程时长(分钟)")
+    private String courseMinutes;
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getStarGrade() {
+        return starGrade;
+    }
+
+    public void setStarGrade(String starGrade) {
+        this.starGrade = starGrade;
+    }
+
+    public String getExpTime() {
+        return expTime;
+    }
+
+    public void setExpTime(String expTime) {
+        this.expTime = expTime;
+    }
+
+    public String getSchool() {
+        return school;
+    }
+
+    public void setSchool(String school) {
+        this.school = school;
+    }
+
+    public String getSchoolSubject() {
+        return schoolSubject;
+    }
+
+    public void setSchoolSubject(String schoolSubject) {
+        this.schoolSubject = schoolSubject;
+    }
+
+    public String getConfigSubject() {
+        return configSubject;
+    }
+
+    public void setConfigSubject(String configSubject) {
+        this.configSubject = configSubject;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getSubjectPrice() {
+        return subjectPrice;
+    }
+
+    public void setSubjectPrice(String subjectPrice) {
+        this.subjectPrice = subjectPrice;
+    }
+
+    public String getCourseMinutes() {
+        return courseMinutes;
+    }
+
+    public void setCourseMinutes(String courseMinutes) {
+        this.courseMinutes = courseMinutes;
+    }
+}
+

+ 28 - 17
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -10,27 +10,38 @@ import io.swagger.annotations.ApiModelProperty;
  */
 @ApiModel(value = "UserOrderDetailVo对象", description = "平台订单表查询视图对象")
 public class UserOrderDetailVo extends UserOrderDetail {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty("买家id ")
-	private Long userId;
+    @ApiModelProperty("买家id ")
+    private Long userId;
 
-	@ApiModelProperty("订单id ")
-	private Long orderId;
+    @ApiModelProperty("订单id ")
+    private Long orderId;
 
-	public Long getUserId() {
-		return userId;
-	}
+    @ApiModelProperty(value = "冗余字段,用于传递参数用")
+    private Object bizParam;
 
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
+    public Long getUserId() {
+        return userId;
+    }
 
-	public Long getOrderId() {
-		return orderId;
-	}
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
 
-	public void setOrderId(Long orderId) {
-		this.orderId = orderId;
-	}
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public Object getBizParam() {
+        return bizParam;
+    }
+
+    public void setBizParam(Object bizParam) {
+        this.bizParam = bizParam;
+    }
 }

+ 38 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonExamineVo.java

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.valid.ListValue;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/19
+ */
+@ApiModel(value = "VideoLessonExamineVo")
+public class VideoLessonExamineVo extends BaseEntity {
+    @ApiModelProperty(value = "主键id")
+    @NotNull(message = "视频组id不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "审核状态  UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过")
+    private String auditStatus;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(String auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+}

+ 10 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -1,8 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo.res;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -30,6 +28,8 @@ public class OrderCreateRes {
     private BigDecimal originalPrice;
     @ApiModelProperty(value = "预计价格 ")
     private BigDecimal expectPrice;
+    @ApiModelProperty(value = "冗余字段,用于传递参数用")
+    private Object bizParam;
 
     public Boolean getRes() {
         return res;
@@ -94,4 +94,12 @@ public class OrderCreateRes {
     public void setGoodType(GoodTypeEnum goodType) {
         this.goodType = goodType;
     }
+
+    public Object getBizParam() {
+        return bizParam;
+    }
+
+    public void setBizParam(Object bizParam) {
+        this.bizParam = bizParam;
+    }
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -284,4 +284,12 @@
         </where>
         order by  cs.id_ desc
     </select>
+
+    <update id="opsPreStudentNum">
+        update course_group
+        set
+            pre_student_num_ = pre_student_num_ + #{num}
+        where id_ = #{id}
+    </update>
+
 </mapper>

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

@@ -30,6 +30,7 @@
                b.end_time_
         from course_plan as a
                  left join course_schedule as b on a.course_group_id_ = b.course_group_id_
+                 AND a.class_num_ = b.class_num_
         where a.course_group_id_ = #{groupId}
         order by b.start_time_
     </select>

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

@@ -312,4 +312,84 @@
         <![CDATA[ AND class_date_  >= #{startDate} ]]>
         <![CDATA[ AND class_date_  <= #{endDate} ]]>
     </select>
+    <select id="teacherList" resultType="com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo">
+        SELECT
+            cs.teacher_id_ AS teacherId,
+            u.username_ AS userName,
+            u.avatar_ AS avatar,
+
+            tt.star_grade_ AS starGrade,
+            tt.exp_time_ AS expTime,
+            t.graduate_school_ AS school,
+            t.subject_ AS schoolSubject,
+
+            (SELECT group_concat(p.subject_name_) FROM teacher_subject_price p WHERE find_in_set(cs.teacher_id_,p.teacher_id_)) AS configSubject,
+            sp.subject_id_ AS subjectId,
+            sp.subject_name_ AS subjectName,
+            sp.subject_price_ AS subjectPrice,
+            sp.course_minutes_ AS courseMinutes
+
+        FROM course_schedule cs
+        LEFT JOIN sys_user u ON cs.teacher_id_ = u.id_
+        LEFT JOIN teacher_total tt ON cs.teacher_id_=tt.user_id_
+        LEFT JOIN teacher t ON cs.teacher_id_=t.user_id_
+        LEFT JOIN teacher_subject_price sp ON cs.teacher_id_=sp.teacher_id_
+
+        WHERE cs.type_='PRACTICE'
+        <if test="param.subjectId !=null">
+            AND sp.subject_id_=#{param.subjectId}
+        </if>
+        <if test="param.search !=null and param.search !=''">
+            AND u.username_ LIKE CONCAT('%', #{param.search}, '%')
+        </if>
+        <choose>
+            <when test="param.sort !=null and param.sort !=''">
+                ORDER BY ${param.sort}
+            </when>
+        </choose>
+    </select>
+    <select id="queryCourseTeacher" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudent"
+            parameterType="com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch">
+        SELECT
+            s.id_ AS courseId,
+            s.course_group_id_ AS courseGoupId,
+            s.class_date_ AS classDate,
+            s.start_time_ AS startTime,
+            s.end_time_ AS endTime,
+            s.type_ AS courseType,
+            s.status_ AS `status`,
+            u.id_ AS userId,
+            u.username_ AS name,
+            u.avatar_ AS cover,
+            g.subject_id_ AS subjectId,
+            b.name_ AS subjectName
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
+        LEFT JOIN course_group g ON s.course_group_id_ = g.id_
+        LEFT JOIN `subject` b ON g.subject_id_ = b.id_
+        WHERE s.id_ IN
+        (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'PRACTICE')
+        AND s.class_date_ = #{param.classDate}
+        UNION
+        SELECT
+            s.id_ AS courseId,
+            s.course_group_id_ AS courseGoupId,
+            s.class_date_ AS classDate,
+            s.start_time_ AS startTime,
+            s.end_time_ AS endTime,
+            s.type_ AS courseType,
+            s.status_ AS `status`,
+            NULL AS userId,
+            CONCAT(g.name_,'-第',s.class_num_,'课') AS name,
+            g.background_pic_ AS cover,
+            g.subject_id_ AS subjectId,
+            sb.name_ AS subjectName
+        FROM course_schedule s
+        LEFT JOIN course_group g ON s.course_group_id_ = g.id_
+        LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
+        WHERE s.id_ IN
+        (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'LIVE')
+        AND s.class_date_ = #{param.classDate}
+        ORDER BY startTime
+    </select>
 </mapper>

+ 13 - 10
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -4,9 +4,11 @@
     <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary">
         <id column="id_" jdbcType="INTEGER" property="id"/>
         <result column="teacher_id_" jdbcType="INTEGER" property="teacherId"/>
+        <result column="student_id_" jdbcType="INTEGER" property="studentId"/>
         <result column="course_schedule_id_" jdbcType="INTEGER" property="courseScheduleId"/>
         <result column="course_group_type_" jdbcType="VARCHAR" property="courseGroupType"/>
-        <result column="course_group_id_" jdbcType="VARCHAR" property="courseGroupId"/>
+        <result column="course_group_id_" jdbcType="INTEGER" property="courseGroupId"/>
+        <result column="class_num_" jdbcType="INTEGER" property="classNum"/>
         <result column="expect_salary_" jdbcType="VARCHAR" property="expectSalary"/>
         <result column="actual_salary_" jdbcType="VARCHAR" property="actualSalary"/>
         <result column="reduce_salary_" jdbcType="VARCHAR" property="reduceSalary"/>
@@ -14,24 +16,25 @@
         <result column="settlement_time_" jdbcType="TIMESTAMP" property="settlementTime"/>
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="status_" jdbcType="VARCHAR" property="status"/>
     </resultMap>
 
     <sql id="Base_Column_List">
         id_
-        , teacher_id_, course_schedule_id_, course_group_type_, course_group_id_, expect_salary_,
-    actual_salary_, reduce_salary_, reduce_salary_remark_, settlement_time_, create_time_, update_time_
+        , teacher_id_, student_id_, course_schedule_id_, course_group_type_, course_group_id_, class_num_, expect_salary_, actual_salary_, reduce_salary_, reduce_salary_remark_, settlement_time_, create_time_, update_time_, status_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary">
-        INSERT INTO course_schedule_teacher_salary(teacher_id_, course_schedule_id_, course_group_type_,
-        course_group_id_, expect_salary_, actual_salary_, reduce_salary_, reduce_salary_remark_, settlement_time_,
-        create_time_, update_time_)
-        VALUES
+        insert into course_schedule_teacher_salary(teacher_id_, student_id_, course_schedule_id_, course_group_type_,
+        course_group_id_, class_num_, expect_salary_, actual_salary_, reduce_salary_, reduce_salary_remark_,
+        settlement_time_, create_time_, update_time_, status_)
+        values
         <foreach collection="entities" item="entity" separator=",">
-            (#{entity.teacherId}, #{entity.courseScheduleId}, #{entity.courseGroupType}, #{entity.courseGroupId},
-            #{entity.expectSalary}, #{entity.actualSalary}, #{entity.reduceSalary}, #{entity.reduceSalaryRemark},
-            #{entity.settlementTime}, NOW(), NOW())
+            (#{entity.teacherId}, #{entity.studentId}, #{entity.courseScheduleId}, #{entity.courseGroupType},
+            #{entity.courseGroupId},#{entity.classNum} ,#{entity.expectSalary}, #{entity.actualSalary},
+            #{entity.reduceSalary}, #{entity.reduceSalaryRemark}, #{entity.settlementTime}, #{entity.createTime},
+            #{entity.updateTime}, #{entity.status})
         </foreach>
     </insert>
 

+ 8 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml

@@ -56,6 +56,14 @@
 		</set>
 		WHERE id_ = #{id}
 	</update>
+	<update id="updateExamine" parameterType="com.yonge.cooleshow.biz.dal.vo.VideoLessonExamineVo">
+		UPDATE video_lesson_group
+		<set>
+			<if test="auditStatus !=null">audit_status_ = #{auditStatus},</if>
+			update_time_ = SYSDATE()
+		</set>
+		WHERE id_ = #{id}
+	</update>
 	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo">
 		SELECT
 			<include refid="baseColumns"/>,

+ 21 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java

@@ -4,12 +4,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseRepliedService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -23,7 +25,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -90,5 +92,23 @@ public class CourseScheduleController extends BaseController {
         search.setStudentId(user.getId());
         return succeed(courseScheduleService.queryCourseScheduleStudent(search));
     }
+
+    @ApiOperation("学生端-首页-陪练课老师列表")
+    @PostMapping("/teacherList")
+    public HttpResponseResult<PageInfo<PracticeTeacherVo>> teacherList(@RequestBody PracticeTeacherSearch search) {
+        IPage<PracticeTeacherVo> pages = courseScheduleService.teacherList(PageUtil.getPage(search), search);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "学生端-课表-日历-用户",notes = "search:{\"classDate\":\"2022-03-27\"}")
+    @PostMapping("/queryCourseTeacher")
+    public HttpResponseResult<Map<String,Object>> queryCourseTeacher(@RequestBody MyCourseSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setStudentId(user.getId());
+        return succeed(courseScheduleService.queryCourseTeacher(search));
+    }
 }
 

+ 0 - 4
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java

@@ -88,17 +88,13 @@ public class CourseScheduleController extends BaseController {
     @ApiOperation(value = "陪练课查询",
             notes = "老师端-首页-我的课程-陪练课\n" +
             "search:{\"classMonth\":\"2022-03\",\"status\":\"COMPLETE\",\"subjectId\":1}\n" +
-            "\n" +
             "老师端-首页-课后评价\n" +
             "search:{\"classMonth\":\"2022-03\",\"replied\":0,\"studentName\":\"测试王\"}\n" +
-            "\n" +
             "老师端-我的-我的主页\n" +
             "search:{\"classMonth\":\"2022-03\"}\n" +
-            "\n" +
             "老师端-课表\n" +
             "search:{\"classDate\":\"2022-03-27\"}\n" +
             "     search:{\"classMonth\":\"2022-03\"}\n" +
-            "\n" +
             "老师端-课表-陪练课\n" +
             "     search:{\"classDate\":\"2022-03-27\"}")
     @PostMapping("/queryTeacherPracticeCourse")

+ 11 - 6
toolset/utils/src/main/java/com/yonge/toolset/utils/easyexcel/ExcelDataReader.java

@@ -9,10 +9,7 @@ import org.slf4j.LoggerFactory;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validation;
 import javax.validation.Validator;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -38,6 +35,8 @@ public class ExcelDataReader<T> extends AnalysisEventListener<T> {
     private final AtomicInteger rows = new AtomicInteger(0);
     //异步执行的集合
     private final List<CompletableFuture<ExcelDataReaderProperty<T>>> futureList = new ArrayList<>();
+    //所有异常的集合 key excel文件
+    private final Map<Integer, String> totalErrorList = new HashMap<>();
     //校验
     private final Validator vf;
 
@@ -59,6 +58,10 @@ public class ExcelDataReader<T> extends AnalysisEventListener<T> {
         return rows.get();
     }
 
+    public Map<Integer, String> getTotalErrorList() {
+        return totalErrorList;
+    }
+
     @Override
     public void invoke(T data, AnalysisContext context) {
         //支持多sheet数据导入,每次换sheet后要清除上一个sheet的数据
@@ -70,7 +73,7 @@ public class ExcelDataReader<T> extends AnalysisEventListener<T> {
         if (rows.get() > maxRows) {
             throw new RuntimeException("导入的数据超过最大行数限制!" + rows.get());
         }
-        CompletableFuture<ExcelDataReaderProperty<T>> future = CompletableFuture.supplyAsync(() -> executed(data));
+        CompletableFuture<ExcelDataReaderProperty<T>> future = CompletableFuture.supplyAsync(() -> executed(data, context));
         futureList.add(future);
         rows.incrementAndGet();
     }
@@ -86,7 +89,7 @@ public class ExcelDataReader<T> extends AnalysisEventListener<T> {
         log.info("ExcelDataReader >> fileName {} >> dataList size {}", fileName, dataList.size());
     }
 
-    private ExcelDataReaderProperty<T> executed(T data) {
+    private ExcelDataReaderProperty<T> executed(T data, AnalysisContext context) {
         ExcelDataReaderProperty<T> property = new ExcelDataReaderProperty<>();
         property.setClazz(data);
         //执行注解校验
@@ -96,6 +99,8 @@ public class ExcelDataReader<T> extends AnalysisEventListener<T> {
                     .map(ConstraintViolation::getMessage)
                     .collect(Collectors.joining());
             property.setErrorMessage(collect);
+            Integer rowIndex = context.readRowHolder().getRowIndex();
+            totalErrorList.put(rowIndex, collect);
         }
         return property;
     }