cy 3 年之前
父节点
当前提交
c2bb832af1
共有 27 个文件被更改,包括 962 次插入4 次删除
  1. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java
  2. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleTeacherTimeDao.java
  3. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PinaoRoomTimeDao.java
  4. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java
  5. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MyCourseSearch.java
  6. 126 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherTime.java
  7. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PinaoRoomTime.java
  8. 78 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBindingTeacher.java
  9. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  11. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleTeacherTimeService.java
  12. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PinaoRoomTimeService.java
  13. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBindingTeacherService.java
  14. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  15. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  16. 196 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleTeacherTimeServiceImpl.java
  17. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PinaoRoomTimeServiceImpl.java
  18. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserBindingTeacherServiceImpl.java
  19. 90 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ArrangeCourseVo.java
  20. 75 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudentVo.java
  21. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PinaoRoomTimeVo.java
  22. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  23. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  24. 5 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherTimeMapper.xml
  25. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PinaoRoomTimeMapper.xml
  26. 25 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml
  27. 63 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleTeacherTimeController.java

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java

@@ -39,6 +39,8 @@ public interface CourseScheduleRepliedDao extends BaseMapper<CourseScheduleRepli
 
     List<Long> selectAll();
 
+    List<Long> selectAllClass();
+
 	/**
 	 * @Description: 查询我的评价
 	 * @Author: cy

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleTeacherTimeDao.java

@@ -0,0 +1,12 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherTime;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface CourseScheduleTeacherTimeDao extends BaseMapper<CourseScheduleTeacherTime> {
+
+}

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PinaoRoomTimeDao.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.PinaoRoomTime;
+import com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface PinaoRoomTimeDao extends BaseMapper<PinaoRoomTime> {
+    //查询琴房剩余时长、冻结时长、统计学员人数
+    PinaoRoomTimeVo selectRemainTime(Long teacherId);
+}

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java

@@ -0,0 +1,19 @@
+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.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface UserBindingTeacherDao extends BaseMapper<UserBindingTeacher> {
+    //我的学员
+    IPage<CourseStudentVo> myStudent(Page<CourseStudentVo> pageInfo,@Param("param") Map<String, Object> param);
+}

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

@@ -36,6 +36,9 @@ public class MyCourseSearch extends QueryInfo {
     @ApiModelProperty(value = "评价学员id")
     private List<Long> repliedIds;
 
+    @ApiModelProperty(value = "评价课程id")
+    private List<Long> classIds;
+
     @ApiModelProperty(value = "学生姓名")
     private String studentName;
 
@@ -45,6 +48,14 @@ public class MyCourseSearch extends QueryInfo {
     @ApiModelProperty(value = "结束时间")
     private String endDate;
 
+    public List<Long> getClassIds() {
+        return classIds;
+    }
+
+    public void setClassIds(List<Long> classIds) {
+        this.classIds = classIds;
+    }
+
     public String getStartDate() {
         return startDate;
     }

+ 126 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherTime.java

@@ -0,0 +1,126 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class CourseScheduleTeacherTime implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("course_group_id_")
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
+    @TableField("course_schedule_id_")
+    @ApiModelProperty(value = "课程id")
+    private Long courseScheduleId;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师id")
+    private Long teacherId;
+
+    @TableField("student_id_list_")
+    @ApiModelProperty(value = "学生id集合")
+    private String studentIdList;
+
+    @TableField("class_num_")
+    @ApiModelProperty(value = "课堂编号-第几堂课")
+    private Integer classNum;
+
+    @TableField("consume_time_")
+    @ApiModelProperty(value = "消耗时长(分钟)")
+    private Long consumeTime;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    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 Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getStudentIdList() {
+        return studentIdList;
+    }
+
+    public void setStudentIdList(String studentIdList) {
+        this.studentIdList = studentIdList;
+    }
+
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
+    public Long getConsumeTime() {
+        return consumeTime;
+    }
+
+    public void setConsumeTime(Long consumeTime) {
+        this.consumeTime = consumeTime;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}
+

+ 102 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PinaoRoomTime.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class PinaoRoomTime implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师id")
+    private Long teacherId;
+
+    @TableField("remain_time_")
+    @ApiModelProperty(value = "剩余时长(分钟)")
+    private Long remainTime;
+
+    @TableField("frozen_time_")
+    @ApiModelProperty(value = "冻结时长(分钟)")
+    private Long frozenTime;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "我的学员")
+    private Integer studentCount;
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    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 Long getRemainTime() {
+        return remainTime;
+    }
+
+    public void setRemainTime(Long remainTime) {
+        this.remainTime = remainTime;
+    }
+
+    public Long getFrozenTime() {
+        return frozenTime;
+    }
+
+    public void setFrozenTime(Long frozenTime) {
+        this.frozenTime = frozenTime;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}
+

+ 78 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBindingTeacher.java

@@ -0,0 +1,78 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class UserBindingTeacher implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师id")
+    private Long teacherId;
+
+    @TableField("student_id_")
+    @ApiModelProperty(value = "学生id")
+    private Long studentId;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @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 Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}
+

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java

@@ -15,6 +15,7 @@ public enum CourseScheduleEnum implements BaseEnum<String, CourseScheduleEnum> {
     //课程类型
     PRACTICE("陪练课"),
     LIVE("直播课"),
+    PIANO_ROOM_CLASS("琴房课"),
     //课程状态
     NOT_START("未开始"),
     ING("进行中"),

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

@@ -19,8 +19,10 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import org.redisson.api.RMap;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 /**
  * 课程组表(CourseGroup)表服务接口

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleTeacherTimeService.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherTime;
+import com.yonge.cooleshow.biz.dal.vo.ArrangeCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
+import com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo;
+import com.yonge.toolset.base.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface CourseScheduleTeacherTimeService extends IService<CourseScheduleTeacherTime> {
+    PinaoRoomTimeVo selectRemainTime(Long teacherId);
+
+    PageInfo<CourseStudentVo> myStudent(Map<String, Object> param);
+
+    void arrangeCourse(ArrangeCourseVo arrangeCourseVo);
+}
+

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PinaoRoomTimeService.java

@@ -0,0 +1,12 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.PinaoRoomTime;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface PinaoRoomTimeService extends IService<PinaoRoomTime> {
+}
+

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBindingTeacherService.java

@@ -0,0 +1,12 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+public interface UserBindingTeacherService extends IService<UserBindingTeacher> {
+}
+

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

@@ -338,7 +338,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @param teacherId 老师id
      * @param timeList  时间集合
      */
-    private <T> void batchCheckTeacherCourseTime(Long teacherId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
+    public <T> void batchCheckTeacherCourseTime(Long teacherId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
         //再校验数据库中课程时间和传入时间是否有交集
         timeList.forEach(o -> {
             boolean checkDataTime = courseScheduleService.checkTeacherCourseTime(teacherId, startTimeFun.apply(o), endTimeFun.apply(o));
@@ -354,12 +354,12 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @param studentId 老师id
      * @param timeList  时间集合
      */
-    private <T> void batchCheckStudentCourseTime(Long studentId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
+    public <T> void batchCheckStudentCourseTime(Long studentId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
         //再校验数据库中课程时间和传入时间是否有交集
         timeList.forEach(o -> {
             boolean checkDataTime = courseScheduleService.checkStudentCourseTime(studentId, startTimeFun.apply(o), endTimeFun.apply(o));
             if (checkDataTime) {
-                throw new BizException("预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
+                throw new BizException("学生id:"+studentId+",预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
             }
         });
     }

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

@@ -652,6 +652,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     public IPage<MyCourseVo> queryTeacherPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search) {
         //查询所有已评价学生id
         List<Long> studentList = repliedDao.selectAll();
+        //查询所有已评价课程id
+        List<Long> classList = repliedDao.selectAllClass();
 
         Integer replied = search.getReplied();
         if (replied != null) {
@@ -670,7 +672,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             if (replied == 1) {
                 if (CollectionUtils.isEmpty(studentList)) {
                     search.setRepliedIds(null);
-                } else search.setRepliedIds(studentList);
+                } else {
+                    search.setRepliedIds(studentList);
+                    search.setClassIds(classList);
+                }
             }
         }
         return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));

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

@@ -0,0 +1,196 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.*;
+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.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherTimeService;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.utils.date.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@Service("courseScheduleTeacherTimeService")
+public class CourseScheduleTeacherTimeServiceImpl extends ServiceImpl<CourseScheduleTeacherTimeDao, CourseScheduleTeacherTime> implements CourseScheduleTeacherTimeService {
+    private final static Logger log = LoggerFactory.getLogger(CourseScheduleTeacherTimeServiceImpl.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private PinaoRoomTimeDao pinaoRoomTimeDao;
+    @Autowired
+    private UserBindingTeacherDao userBindingTeacherDao;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private CourseGroupServiceImpl groupService;
+    @Autowired
+    private CourseGroupDao courseGroupDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
+    /**
+     * @Description: 查询琴房剩余时长、冻结时长、统计学员人数
+     * @Author: cy
+     * @Date: 2022/5/26
+     */
+    @Override
+    public PinaoRoomTimeVo selectRemainTime(Long teacherId) {
+        return pinaoRoomTimeDao.selectRemainTime(teacherId);
+    }
+
+    /**
+     * @Description: 我的学员
+     * @Author: cy
+     * @Date: 2022/5/26
+     */
+    @Override
+    public PageInfo<CourseStudentVo> myStudent(Map<String, Object> param) {
+        Page<CourseStudentVo> pageInfo = PageUtil.getPageInfo(param);
+        IPage<CourseStudentVo> page = userBindingTeacherDao.myStudent(pageInfo, param);
+        return PageUtil.pageInfo(page);
+    }
+
+    /**
+     * @Description: 排课
+     * @Author: cy
+     * @Date: 2022/5/26
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void arrangeCourse(ArrangeCourseVo arrangeCourseVo) {
+        Integer classNum = arrangeCourseVo.getClassNum();//课时数
+        Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
+        List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
+        Integer consumTime = classNum * singleClssTime * studentIds.size();//消耗时长
+        List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
+        Integer consumeTime = arrangeCourseVo.getConsumeTime();
+        SysUser user = sysUserFeignService.queryUserInfo();
+        Long teacherId = user.getId();
+
+        //校验课时
+        if (timeList.size() != classNum) {
+            throw new BizException("课时数与排课数不符");
+        }
+
+        //校验消耗时长
+        if (!consumTime.equals(consumeTime)){
+            throw new BizException("时长计算错误");
+        }
+
+        //校验时长
+        PinaoRoomTime pinaoRoomTime = pinaoRoomTimeDao.selectOne(Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId, teacherId));
+        if (pinaoRoomTime == null) {
+            throw new BizException("未查询到老师剩余时长");
+        }
+        Long remainTime = pinaoRoomTime.getRemainTime();
+        Long frozenTime = pinaoRoomTime.getFrozenTime();
+        if (consumTime > remainTime) {
+            throw new BizException("剩余时长不足");
+        }
+
+        //校验学员是否绑定
+        List<UserBindingTeacher> bindingTeachers = userBindingTeacherDao.selectList(Wrappers.<UserBindingTeacher>lambdaQuery().eq(UserBindingTeacher::getTeacherId, teacherId));
+        if (CollectionUtils.isEmpty(bindingTeachers)) {
+            throw new BizException("无绑定学员");
+        }
+        List<Long> studentList = bindingTeachers.stream().map(UserBindingTeacher::getStudentId).collect(Collectors.toList());
+        for (Long studentId : studentIds) {
+            if (!studentList.contains(studentId)) {
+                throw new BizException("学员id:{},未绑定", studentId);
+            }
+        }
+
+        //校验传入时间是否交集
+        if (timeList.size() > 1) {
+            for (int i = 0; i < timeList.size(); i++) {
+                if (i == timeList.size() - 1) {
+                    break;
+                }
+                CourseTimeEntity o = timeList.get(i);
+                List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
+                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
+                if (checkParamTime) {
+                    throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
+                }
+            }
+        }
+
+        //批量检查老师课时在数据库是否重复
+        groupService.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+
+        //校验购买的课程组每节课时间是否和自己的课时冲突
+        for (Long studentId : studentIds) {
+            groupService.batchCheckStudentCourseTime(studentId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        }
+
+        //添加课程组
+        CourseGroup courseGroup = new CourseGroup();
+        courseGroup.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+        courseGroup.setTeacherId(teacherId);
+        courseGroup.setName(arrangeCourseVo.getCourseName());
+        courseGroup.setSubjectId(arrangeCourseVo.getSubjectId());
+        courseGroup.setSingleCourseMinutes(singleClssTime);
+        courseGroup.setCourseNum(classNum);
+        courseGroup.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+        courseGroup.setCreatedBy(teacherId);
+        courseGroupDao.insert(courseGroup);
+
+        for (int i = 0; i < timeList.size(); i++) {
+            //添加课程
+            CourseTimeEntity courseTimeEntity = timeList.get(i);
+            CourseSchedule schedule = new CourseSchedule();
+            schedule.setCourseGroupId(courseGroup.getId());
+            schedule.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+            schedule.classNum(i + 1);
+            schedule.setTeacherId(teacherId);
+            schedule.setClassDate(DateUtil.trunc(courseTimeEntity.getStartTime()));
+            schedule.setStartTime(courseTimeEntity.getStartTime());
+            schedule.setEndTime(courseTimeEntity.getEndTime());
+            schedule.setLock(0);
+            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
+            schedule.setCreatedBy(teacherId);
+            courseScheduleDao.insert(schedule);
+
+            //添加course_schedule_teacher_time
+            CourseScheduleTeacherTime teacherTime = new CourseScheduleTeacherTime();
+            teacherTime.setCourseGroupId(courseGroup.getId());
+            teacherTime.setCourseScheduleId(schedule.getId());
+            teacherTime.setTeacherId(teacherId);
+            teacherTime.setStudentIdList(studentIds.toString());
+            teacherTime.setClassNum(i + 1);
+            teacherTime.setConsumeTime(Long.valueOf(singleClssTime));
+            baseMapper.insert(teacherTime);
+        }
+
+        //扣减pinao_room_time
+        PinaoRoomTime roomTime = new PinaoRoomTime();
+        roomTime.setRemainTime(remainTime - consumTime);
+        roomTime.setFrozenTime(frozenTime + consumTime);
+        pinaoRoomTimeDao.update(roomTime,Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId,teacherId));
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.PinaoRoomTimeDao;
+import com.yonge.cooleshow.biz.dal.entity.PinaoRoomTime;
+import com.yonge.cooleshow.biz.dal.service.PinaoRoomTimeService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@Service("pinaoRoomTimeService")
+public class PinaoRoomTimeServiceImpl extends ServiceImpl<PinaoRoomTimeDao, PinaoRoomTime> implements PinaoRoomTimeService {
+    private final static Logger log = LoggerFactory.getLogger(PinaoRoomTimeServiceImpl.class);
+
+}
+

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

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
+import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@Service("userBindingTeacherService")
+public class UserBindingTeacherServiceImpl extends ServiceImpl<UserBindingTeacherDao, UserBindingTeacher> implements UserBindingTeacherService {
+    private final static Logger log = LoggerFactory.getLogger(UserBindingTeacherServiceImpl.class);
+
+}
+

+ 90 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ArrangeCourseVo.java

@@ -0,0 +1,90 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class ArrangeCourseVo implements Serializable {
+    @ApiModelProperty("课程名称")
+    private String courseName;
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+    @ApiModelProperty("学员id集合")
+    private List<Long> studentIds;
+    @ApiModelProperty("课时数")
+    private Integer classNum;
+    @ApiModelProperty("单课时长")
+    private Integer singleClssTime;
+    @ApiModelProperty("消耗时长")
+    private Integer consumeTime;
+    @ApiModelProperty("上课时间")
+    private List<CourseTimeEntity> timeList;
+
+    public Integer getConsumeTime() {
+        return consumeTime;
+    }
+
+    public void setConsumeTime(Integer consumeTime) {
+        this.consumeTime = consumeTime;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public List<Long> getStudentIds() {
+        return studentIds;
+    }
+
+    public void setStudentIds(List<Long> studentIds) {
+        this.studentIds = studentIds;
+    }
+
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
+    public Integer getSingleClssTime() {
+        return singleClssTime;
+    }
+
+    public void setSingleClssTime(Integer singleClssTime) {
+        this.singleClssTime = singleClssTime;
+    }
+
+    public List<CourseTimeEntity> getTimeList() {
+        return timeList;
+    }
+
+    public void setTimeList(List<CourseTimeEntity> timeList) {
+        this.timeList = timeList;
+    }
+}
+
+
+

+ 75 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudentVo.java

@@ -0,0 +1,75 @@
+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/5/26
+ */
+@ApiModel
+public class CourseStudentVo implements Serializable {
+    @ApiModelProperty("用户")
+    private String userId;
+    @ApiModelProperty("昵称")
+    private String userName;
+    @ApiModelProperty("真实姓名")
+    private String realName;
+    @ApiModelProperty("头像地址")
+    private String avatar;
+    @ApiModelProperty("声部")
+    private String subjectName;
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}
+

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PinaoRoomTimeVo.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.PinaoRoomTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class PinaoRoomTimeVo extends PinaoRoomTime {
+    @ApiModelProperty(value = "我的学员")
+    private Integer studentCount;
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+}
+

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

@@ -212,6 +212,12 @@
                 #{repliedIds}
             </foreach>
         </if>
+        <if test="param.classIds !=null and param.classIds.size>0">
+            AND p.course_id_ IN
+            <foreach collection="param.classIds" item="classIds" open="(" close=")" separator=",">
+                #{classIds}
+            </foreach>
+        </if>
         <if test="param.studentName !=null and param.studentName !=''">
             AND u.username_ LIKE CONCAT('%', #{param.studentName}, '%')
         </if>

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

@@ -158,4 +158,7 @@
         AND t.course_group_id_=#{courseGroupId}
         AND t.course_group_type_=#{courseGroupType}
     </select>
+    <select id="selectAllClass" resultType="java.lang.Long">
+        SELECT course_schedule_id_ FROM course_schedule_replied WHERE course_group_type_='PRACTICE'
+    </select>
 </mapper>

+ 5 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherTimeMapper.xml

@@ -0,0 +1,5 @@
+<?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.CourseScheduleTeacherTimeDao">
+
+</mapper>

+ 12 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PinaoRoomTimeMapper.xml

@@ -0,0 +1,12 @@
+<?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.PinaoRoomTimeDao">
+
+    <select id="selectRemainTime" resultType="com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo"
+            parameterType="java.lang.Long">
+        SELECT *,
+        (SELECT COUNT(1) FROM user_binding_teacher WHERE teacher_id_=#{teacherId}) AS studentCount
+        FROM pinao_room_time
+        WHERE teacher_id_=#{teacherId}
+    </select>
+</mapper>

+ 25 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

@@ -0,0 +1,25 @@
+<?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.UserBindingTeacherDao">
+
+    <select id="myStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudentVo">
+        SELECT
+        su.id_ AS userId,
+        su.username_ AS userName,
+        su.real_name_ AS realName,
+        su.avatar_ AS avatar,
+        su.phone_ AS phone,
+        (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName
+        FROM user_binding_teacher b
+        LEFT JOIN sys_user su ON b.student_id_=su.id_
+        LEFT JOIN student s ON b.student_id_=s.user_id_
+        <where>
+            <if test="param.subjectId != null">
+                find_in_set(#{param.subjectId},s.subject_id_)
+            </if>
+            <if test="param.userName !=null and param.userName !=''">
+                AND su.username_ LIKE CONCAT('%', #{param.userName}, '%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 63 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleTeacherTimeController.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherTimeService;
+import com.yonge.cooleshow.biz.dal.vo.ArrangeCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
+import com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@Api("琴房")
+@RestController
+@RequestMapping("/pinaoRoom")
+public class CourseScheduleTeacherTimeController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private CourseScheduleTeacherTimeService courseScheduleTeacherTimeService;
+
+    @ApiOperation("查询琴房剩余时长、冻结时长、统计学员人数")
+    @GetMapping("/selectRemainTime")
+    public HttpResponseResult<PinaoRoomTimeVo> selectRemainTime() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseScheduleTeacherTimeService.selectRemainTime(user.getId()));
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "subjectId", dataType = "Long", value = "声部id"),
+            @ApiImplicitParam(name = "userName", dataType = "String", value = "学员姓名"),
+    })
+    @ApiOperation("我的学员")
+    @PostMapping("/myStudent")
+    public HttpResponseResult<PageInfo<CourseStudentVo>> myStudent(@RequestBody Map<String, Object> param) {
+        return succeed(courseScheduleTeacherTimeService.myStudent(param));
+    }
+
+    @ApiOperation("排课")
+    @PostMapping("/arrangeCourse")
+    public HttpResponseResult<Object> arrangeCourse(@RequestBody ArrangeCourseVo arrangeCourseVo){
+        courseScheduleTeacherTimeService.arrangeCourse(arrangeCourseVo);
+        return succeed();
+    }
+}
+