Переглянути джерело

Merge remote-tracking branch 'origin/master'

weifanli 3 роки тому
батько
коміт
c835f34d69
21 змінених файлів з 1026 додано та 59 видалено
  1. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseHomeworkController.java
  2. 35 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseHomeworkDao.java
  3. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  4. 52 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkReviewDto.java
  5. 86 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkSaveDto.java
  6. 15 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/HomeworkSearch.java
  7. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java
  8. 30 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseHomeworkService.java
  9. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  10. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentAttendanceService.java
  11. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentCourseHomeworkService.java
  12. 158 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  13. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  14. 17 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentAttendanceServiceImpl.java
  15. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentCourseHomeworkServiceImpl.java
  16. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CountVo.java
  17. 259 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkDetailVo.java
  18. 99 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java
  19. 109 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  20. 14 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  21. 77 5
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

+ 2 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseHomeworkController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -40,7 +41,7 @@ public class CourseHomeworkController extends BaseController {
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入courseHomeworkSearch")
-    public HttpResponseResult<PageInfo<CourseHomeworkVo>> page(@RequestBody CourseHomeworkSearch query) {
+    public HttpResponseResult<PageInfo<CourseHomeworkVo>> page(@RequestBody HomeworkSearch query) {
 		IPage<CourseHomeworkVo> pages = courseHomeworkService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
 	}

+ 35 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseHomeworkDao.java

@@ -1,30 +1,52 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
-import java.util.List;
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
-import com.yonge.cooleshow.biz.dal.dto.search.CourseHomeworkSearch;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
-public interface CourseHomeworkDao extends BaseMapper<CourseHomework>{
+public interface CourseHomeworkDao extends BaseMapper<CourseHomework> {
 	/**
 	 * 查询详情
-     * @author liweifan
-     * @date 2022-03-30 13:53:51
-     * @return: com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo
+	 *
+	 * @author liweifan
+	 * @date 2022-03-30 13:53:51
+	 * @return: com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo
 	 */
 	CourseHomeworkVo detail(@Param("id") Long id);
 
 	/**
 	 * 分页查询
-     * @author liweifan
-     * @date 2022-03-30 13:53:51
-     * @return: com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo
+	 *
+	 * @author liweifan
+	 * @date 2022-03-30 13:53:51
+	 * @return: com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo
 	 */
-	List<CourseHomeworkVo> selectPage(@Param("page") IPage page, @Param("param") CourseHomeworkSearch courseHomework);
-	
+	List<CourseHomeworkVo> selectPage(@Param("page") IPage<CourseHomeworkVo> page, @Param("param") HomeworkSearch query);
+
+	/**
+	 * 课程详情 课后作业信息
+	 *
+	 * @param courseId 课程id
+	 * @return 课后作业信息
+	 */
+    CourseHomeworkDetailVo selectCourseHomeworkDetailByCourseId(@Param("courseId") Long courseId);
+
+	/**
+	 * 获取课程购买的用户信息
+	 *
+	 * @param courseGroupId    课程组id
+	 * @param courseScheduleId 课程id
+	 * @return 购买用户信息
+	 */
+	CourseHomeworkDetailVo selectPaymentStudentInfo(@Param("courseGroupId") Long courseGroupId, @Param(
+			"courseScheduleId") Long courseScheduleId);
+
+	List<CourseHomeworkVo> selectStudentInfo(@Param("records") List<CourseHomeworkVo> records);
 }

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

@@ -76,7 +76,7 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     /**
      * 老师未布置的课程作业数量
      * <p>
-     * 陪练课 课程状态为完成,有学生考勤记录 没有学生课程记录
+     * 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
      *
      * @param param 查询条件
      * @return number

+ 52 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkReviewDto.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description 老师作业点评
+ *
+ * @author liujunchi
+ * @date 2022-04-14
+ */
+@ApiModel("老师作业点评")
+public class CourseHomeworkReviewDto {
+
+    @ApiModelProperty(value = "课程ID",required = true)
+    @NotNull(message = "课程ID不能为空 ")
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "点评信息",required = true)
+    @NotBlank(message = "点评信息不能为空")
+    private String review;
+
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getReview() {
+        return review;
+    }
+
+    public void setReview(String review) {
+        this.review = review;
+    }
+}

+ 86 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkSaveDto.java

@@ -0,0 +1,86 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description 布置作业
+ *
+ * @author liujunchi
+ * @date 2022-04-14
+ */
+@ApiModel("布置作业信息")
+public class CourseHomeworkSaveDto {
+
+    @ApiModelProperty(value = "课后作业id",hidden = true)
+    private Long courseHomeworkId;
+
+    @ApiModelProperty(value = "课程编号",required = true)
+    @NotNull(message = "课程编号不能为空 ")
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "作业标题",required = true)
+    @NotBlank(message = "作业标题不能为空 ")
+    private String title;
+
+    @ApiModelProperty(value = "作业内容",required = true)
+    @NotBlank(message = "作业内容不能为空 ")
+    private String content;
+
+    @ApiModelProperty("作业附件地址(多个用逗号分隔)")
+    private String attachments;
+
+    @ApiModelProperty(value = "老师id",hidden = true)
+    private Long teacherId;
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getCourseHomeworkId() {
+        return courseHomeworkId;
+    }
+
+    public void setCourseHomeworkId(Long courseHomeworkId) {
+        this.courseHomeworkId = courseHomeworkId;
+    }
+}

+ 15 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/HomeworkSearch.java

@@ -15,18 +15,29 @@ import io.swagger.annotations.ApiModelProperty;
 @ApiModel("课后作业查询条件")
 public class HomeworkSearch extends QueryInfo {
 
-    @ApiModelProperty("老师id")
+    @ApiModelProperty(value = "老师id",hidden = true)
     private Long teacherId;
 
-    @ApiModelProperty("课程类型: PRACTICE 陪练课; LIVE 直播课")
+    @ApiModelProperty(value = "课程类型: PRACTICE 陪练课; LIVE 直播课",hidden = true)
     private CourseScheduleEnum courseType;
 
-    @ApiModelProperty("课程状态: NOT_START:未开始; ING:进行中; COMPLETE:已完成; CANCEL:已取消")
+    @ApiModelProperty(value = "课程状态: NOT_START:未开始; ING:进行中; COMPLETE:已完成; CANCEL:已取消",hidden = true)
     private CourseScheduleEnum courseStatus;
 
-    @ApiModelProperty("布置作业 0:否,1:是")
+    @ApiModelProperty("布置作业状态 0:否,1:是")
     private YesOrNoEnum decorate;
 
+    @ApiModelProperty(value = "课程编号ID",hidden = true)
+    private Long courseScheduleId;
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
     public Long getTeacherId() {
         return teacherId;
     }

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

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -7,7 +10,7 @@ import java.util.stream.Collectors;
 /**
  * 课程类型
  */
-public enum CourseScheduleEnum {
+public enum CourseScheduleEnum implements BaseEnum<String,CourseScheduleEnum> {
     //课程类型
     PRACTICE("PRACTICE", "陪练课"),
     LIVE("LIVE", "直播课"),
@@ -17,6 +20,7 @@ public enum CourseScheduleEnum {
     COMPLETE("COMPLETE", "已完成"),
     CANCEL("CANCEL", "已取消");
 
+    @EnumValue
     private String code;
 
     private String msg;

+ 30 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseHomeworkService.java

@@ -2,9 +2,12 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
-import com.yonge.cooleshow.biz.dal.dto.search.CourseHomeworkSearch;
+import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
+import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
 
 /**
  * 课程作业表 服务类
@@ -22,8 +25,30 @@ public interface CourseHomeworkService extends IService<CourseHomework>  {
 
     /**
      * 分页查询
-     * @author liweifan
- 	 * @date 2022-03-30
      */
-    IPage<CourseHomeworkVo> selectPage(IPage<CourseHomeworkVo> page, CourseHomeworkSearch query);
+    IPage<CourseHomeworkVo> selectPage(IPage<CourseHomeworkVo> page, HomeworkSearch query);
+
+	/**
+	 * 课程详情 课后作业信息
+	 *
+	 * @param courseId 课程id
+	 * @return 课后作业信息
+	 */
+	CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId);
+
+	/**
+	 * 老师布置作业
+	 *
+	 * @param saveDto 作业信息
+	 * @return boolean
+	 */
+    boolean decorateCourseHomework(CourseHomeworkSaveDto saveDto);
+
+	/**
+	 * 老师点评学生课后作业
+	 *
+	 * @param reviewDto 点评信息
+	 * @return boolean
+	 */
+    boolean reviewCourseHomework(CourseHomeworkReviewDto reviewDto);
 }

+ 10 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -137,7 +137,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     /**
      * 老师未布置的课程作业数量
-     * 陪练课 课程状态为完成,有学生考勤记录 没有学生课程记录
+     * 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
      *
      * @param homeworkSearch 查询信息
      * @return number
@@ -148,6 +148,15 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     IPage<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search);
 
+    /**
+     * 检查课程是否属于老师
+     *
+     * @param teacherId 老师id
+     * @param courseId 课程id
+     * @return boolean true 属于老师
+     */
+    boolean checkCourseSchedule(Long teacherId, Long courseId);
+
     List<String> queryCourseScheduleStudent(MyCourseSearch search);
 }
 

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentAttendanceService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.vo.StudentAttendanceVo;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentAttendanceSearch;
 import com.yonge.cooleshow.biz.dal.entity.StudentAttendance;
@@ -26,4 +27,13 @@ public interface StudentAttendanceService extends IService<StudentAttendance>  {
  	 * @date 2022-03-30
      */
     IPage<StudentAttendanceVo> selectPage(IPage<StudentAttendanceVo> page, StudentAttendanceSearch query);
+
+	/**
+	 * 获取学生考勤信息
+	 *
+	 * @param courseType 课程类型 PRACTICE:陪练课、LIVE:直播课
+	 * @param courseScheduleId 课程id
+	 * @return 考勤对象
+	 */
+    StudentAttendance getByCourseTypeAndScheduleId(CourseScheduleEnum courseType, Long courseScheduleId);
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentCourseHomeworkService.java

@@ -26,4 +26,13 @@ public interface StudentCourseHomeworkService extends IService<StudentCourseHome
  	 * @date 2022-03-30
      */
     IPage<StudentCourseHomeworkVo> selectPage(IPage<StudentCourseHomeworkVo> page, StudentCourseHomeworkSearch query);
+
+	/**
+	 *  老师点评
+	 *
+	 * @param studentHomeworkId 学生作业id
+	 * @param review 点评信息
+	 * @return boolean
+	 */
+    boolean reviewCourseHome(Long studentHomeworkId, String review);
 }

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

@@ -2,26 +2,176 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
-import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
-import com.yonge.cooleshow.biz.dal.dto.search.CourseHomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dao.CourseHomeworkDao;
+import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
+import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
+import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseHomeworkService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.StudentAttendanceService;
+import com.yonge.cooleshow.biz.dal.service.StudentCourseHomeworkService;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
+import com.yonge.cooleshow.common.exception.BizException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
 
 
 @Service
 public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, CourseHomework> implements CourseHomeworkService {
 
+    @Autowired
+    @Lazy
+    private CourseScheduleService courseScheduleService;
+
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
 	@Override
     public CourseHomeworkVo detail(Long id) {
         CourseHomeworkVo detail = baseMapper.detail(id);
         return detail;
     }
     
-     @Override
-    public IPage<CourseHomeworkVo> selectPage(IPage<CourseHomeworkVo> page, CourseHomeworkSearch query){
-        return page.setRecords(baseMapper.selectPage(page, query));
+    @Override
+    public IPage<CourseHomeworkVo> selectPage(IPage<CourseHomeworkVo> page, HomeworkSearch query){
+        IPage<CourseHomeworkVo> courseHomeworkVoIPage = page.setRecords(baseMapper.selectPage(page, query));
+        List<CourseHomeworkVo> records = courseHomeworkVoIPage.getRecords();
+        List<CourseHomeworkVo> userInfoList = baseMapper.selectStudentInfo(records);
+        for (int i = 0; i < records.size(); i++) {
+            CourseHomeworkVo userInfo = userInfoList.get(i);
+            records.get(i).setStudentAvatar(userInfo.getStudentAvatar());
+            records.get(i).setStudentName(userInfo.getStudentName());
+            records.get(i).setSubjectName(userInfo.getSubjectName());
+        }
+        return courseHomeworkVoIPage;
+    }
+
+    @Override
+    public CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId) {
+
+        // 课程基本信息
+        CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper.selectCourseHomeworkDetailByCourseId(courseId);
+
+        // 学生信息
+        CourseHomeworkDetailVo studentInfoDetailVo = baseMapper
+                .selectPaymentStudentInfo(courseHomeworkDetailVo.getCourseGroupId(),courseHomeworkDetailVo.getCourseScheduleId());
+
+        // 拼接数据
+        courseHomeworkDetailVo.setStudentName(studentInfoDetailVo.getStudentName());
+        courseHomeworkDetailVo.setStudentAvatar(studentInfoDetailVo.getStudentAvatar());
+        courseHomeworkDetailVo.setSubjectName(studentInfoDetailVo.getSubjectName());
+        return courseHomeworkDetailVo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean decorateCourseHomework(CourseHomeworkSaveDto saveDto) {
+        // 检查 老师 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
+        checkCourseSchedule(saveDto.getCourseScheduleId());
+
+        // 检查已经布置了课后作业
+        CourseHomework homework = checkHasHomework(saveDto.getCourseScheduleId());
+        if (homework != null) {
+            saveDto.setCourseHomeworkId(homework.getId());
+        }
+
+        CourseSchedule courseSchedule = courseScheduleService.getById(saveDto.getCourseScheduleId());
+        // 创建课后作业
+        CourseHomework courseHomework = getCourseHomework(saveDto, courseSchedule);
+
+        return this.saveOrUpdate(courseHomework);
+    }
+
+    /**
+     * 获取课程作业
+     *
+     * @param courseScheduleId 课程id
+     * @return CourseHomework
+     */
+    private CourseHomework checkHasHomework(Long courseScheduleId) {
+        List<CourseHomework> list = this.lambdaQuery()
+                                        .eq(CourseHomework::getCourseScheduleId, courseScheduleId)
+                                        .eq(CourseHomework::getCourseGroupType, CourseScheduleEnum.PRACTICE.getCode())
+                                        .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean reviewCourseHomework(CourseHomeworkReviewDto reviewDto) {
+        // 检查 老师 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
+        checkCourseSchedule(reviewDto.getCourseScheduleId());
+
+        // 检查已经布置了课后作业
+        if (checkHasHomework(reviewDto.getCourseScheduleId()) == null) {
+            throw new BizException("没布置作业,不能点评");
+        }
+
+        // 课程基本信息
+        CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper
+                .selectCourseHomeworkDetailByCourseId(reviewDto.getCourseScheduleId());
+
+        // 检查学生是否提交作业
+        if (!YesOrNoEnum.YES.getCode().equals(courseHomeworkDetailVo.getSubmitHomework().getCode())) {
+            throw  new BizException("学生未提交作业,不能点评");
+        }
+        return studentCourseHomeworkService.reviewCourseHome(courseHomeworkDetailVo.getStudentHomeworkId(),reviewDto.getReview());
+    }
+
+    /**
+     * 检查课程能否布置作业
+     *
+     * @param courseScheduleId 课程id
+     */
+    private void checkCourseSchedule(Long courseScheduleId) {
+        // 1. 检查课程类型
+        CourseSchedule courseSchedule = courseScheduleService.getById(courseScheduleId);
+        if (!CourseScheduleEnum.PRACTICE.getCode().equals(courseSchedule.getType())) {
+            throw  new BizException("非陪练课,不能布置课后作业");
+        }
+        // 2. 检查课程结束
+        if (!CourseScheduleEnum.COMPLETE.getCode().equals(courseSchedule.getStatus())) {
+            throw  new BizException("课程未正常完成,不能布置课后作业");
+        }
+    }
+
+    /**
+     * 封装课程课后作业对象
+     *
+     * @param saveDto 课后作业信息
+     * @param courseSchedule 课程信息
+     * @return 课后作业对象
+     */
+    private CourseHomework getCourseHomework(CourseHomeworkSaveDto saveDto, CourseSchedule courseSchedule) {
+        CourseHomework courseHomework = new CourseHomework();
+        courseHomework.setId(saveDto.getCourseHomeworkId());
+        courseHomework.setCourseGroupId(courseSchedule.getCourseGroupId());
+        courseHomework.setCourseGroupType(CourseScheduleEnum.PRACTICE.getCode());
+        courseHomework.setCourseScheduleId(saveDto.getCourseScheduleId());
+        courseHomework.setTitle(saveDto.getTitle());
+        courseHomework.setContent(saveDto.getContent());
+        courseHomework.setAttachments(saveDto.getAttachments());
+        courseHomework.setExpectNum(1);
+        courseHomework.setCompletedNum(0);
+        courseHomework.setCreateTime(new Date());
+        return courseHomework;
     }
-	
+
 }

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

@@ -654,7 +654,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     @Override
     public Integer countTeacherNoDecorateHomework(HomeworkSearch homeworkSearch) {
 
-        // 陪练课 课程状态为完成,有学生考勤记录 没有学生课程记录
+        // 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
         return baseMapper.countTeacherNoDecorateHomework(homeworkSearch);
     }
 
@@ -676,6 +676,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         return page.setRecords(baseMapper.queryStudentPracticeCourse(page, search));
     }
 
+    @Override
+    public boolean checkCourseSchedule(Long teacherId, Long courseId) {
+        CourseSchedule courseSchedule = this.getById(courseId);
+        return teacherId.equals(courseSchedule.getTeacherId());
+    }
     /**
      * @Description: 查询学生约课日历
      * @Author: cy

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

@@ -2,12 +2,16 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.StudentAttendance;
 import com.yonge.cooleshow.biz.dal.vo.StudentAttendanceVo;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentAttendanceSearch;
 import com.yonge.cooleshow.biz.dal.dao.StudentAttendanceDao;
 import com.yonge.cooleshow.biz.dal.service.StudentAttendanceService;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
 
 
 @Service
@@ -23,5 +27,17 @@ public class StudentAttendanceServiceImpl extends ServiceImpl<StudentAttendanceD
     public IPage<StudentAttendanceVo> selectPage(IPage<StudentAttendanceVo> page, StudentAttendanceSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
+    @Override
+    public StudentAttendance getByCourseTypeAndScheduleId(CourseScheduleEnum courseType, Long courseScheduleId) {
+        List<StudentAttendance> list = this.lambdaQuery()
+                                           .eq(StudentAttendance::getCourseGroupType, courseType)
+                                           .eq(StudentAttendance::getCourseScheduleId, courseScheduleId)
+                                           .list();
+        if (!CollectionUtils.isEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
+
 }

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

@@ -23,5 +23,13 @@ public class StudentCourseHomeworkServiceImpl extends ServiceImpl<StudentCourseH
     public IPage<StudentCourseHomeworkVo> selectPage(IPage<StudentCourseHomeworkVo> page, StudentCourseHomeworkSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
+    @Override
+    public boolean reviewCourseHome(Long studentHomeworkId, String review) {
+        return this.lambdaUpdate()
+                .eq(StudentCourseHomework::getId,studentHomeworkId)
+                .set(StudentCourseHomework::getTeacherReplied,review)
+                .update();
+    }
+
 }

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

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 数量
+ *
+ * @author liujunchi
+ * @date 2022-04-15
+ */
+public class CountVo {
+
+    @ApiModelProperty("数量")
+    private Integer count;
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}

+ 259 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkDetailVo.java

@@ -0,0 +1,259 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * Description 课后作业详情信息展示
+ *
+ * @author liujunchi
+ * @date 2022-04-14
+ */
+@ApiModel("课后作业详情信息展示")
+public class CourseHomeworkDetailVo {
+
+    @ApiModelProperty("课后作业主键ID ")
+    private Long id;
+
+    @ApiModelProperty("课程编号ID")
+    private Long courseScheduleId;
+
+    @ApiModelProperty("课程组id")
+    private Long courseGroupId;
+
+    @ApiModelProperty("学生课程作业id")
+    private Long studentHomeworkId;
+
+    @ApiModelProperty("课程类型 PRACTICE 陪练课 LIVE直播课")
+    private CourseScheduleEnum courseType;
+
+    @ApiModelProperty("上课日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private String classDate;
+
+    @ApiModelProperty("上课时间")
+    @DateTimeFormat(pattern = "HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private String startTime;
+
+    @ApiModelProperty("下课时间")
+    @DateTimeFormat(pattern = "HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private String endTime;
+
+    @ApiModelProperty("课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消")
+    private CourseScheduleEnum courseStatus;
+
+    @ApiModelProperty("作业标题; ")
+    private String title;
+
+    @ApiModelProperty("作业内容 ")
+    private String content;
+
+    @ApiModelProperty("作业附件地址(多个用逗号分隔) ")
+    private String attachments;
+
+    @ApiModelProperty("学员提交的作品附件 ")
+    private String studentAttachments;
+
+    @ApiModelProperty("老师的作业点评 ")
+    private String teacherReplied;
+
+    @ApiModelProperty("作业提交时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date submitTime;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("学员姓名")
+    private String studentName;
+
+    @ApiModelProperty("学员头像")
+    private String studentAvatar;
+
+    @ApiModelProperty("布置作业,0:未布置,1:已布置")
+    private YesOrNoEnum decorateHomework;
+
+    @ApiModelProperty("学生提交作业 0:未提交,1:已提交")
+    private YesOrNoEnum submitHomework;
+
+    @ApiModelProperty("点评作业 0:未点评,1:已点评")
+    private YesOrNoEnum reviewHomework;
+
+    public YesOrNoEnum getDecorateHomework() {
+        return decorateHomework;
+    }
+
+    public void setDecorateHomework(YesOrNoEnum decorateHomework) {
+        this.decorateHomework = decorateHomework;
+    }
+
+    public YesOrNoEnum getSubmitHomework() {
+        return submitHomework;
+    }
+
+    public void setSubmitHomework(YesOrNoEnum submitHomework) {
+        this.submitHomework = submitHomework;
+    }
+
+    public YesOrNoEnum getReviewHomework() {
+        return reviewHomework;
+    }
+
+    public void setReviewHomework(YesOrNoEnum reviewHomework) {
+        this.reviewHomework = reviewHomework;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentAvatar() {
+        return studentAvatar;
+    }
+
+    public void setStudentAvatar(String studentAvatar) {
+        this.studentAvatar = studentAvatar;
+    }
+
+    public CourseScheduleEnum getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseScheduleEnum courseType) {
+        this.courseType = courseType;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public CourseScheduleEnum getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(CourseScheduleEnum courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
+
+    public String getStudentAttachments() {
+        return studentAttachments;
+    }
+
+    public void setStudentAttachments(String studentAttachments) {
+        this.studentAttachments = studentAttachments;
+    }
+
+    public String getTeacherReplied() {
+        return teacherReplied;
+    }
+
+    public void setTeacherReplied(String teacherReplied) {
+        this.teacherReplied = teacherReplied;
+    }
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public Long getStudentHomeworkId() {
+        return studentHomeworkId;
+    }
+
+    public void setStudentHomeworkId(Long studentHomeworkId) {
+        this.studentHomeworkId = studentHomeworkId;
+    }
+}

+ 99 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java

@@ -1,14 +1,111 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
-import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * @Author: liweifan
  * @Data: 2022-03-30 13:53:51
  */
 @ApiModel(value = "CourseHomeworkVo对象", description = "课程作业表查询视图对象")
-public class CourseHomeworkVo extends CourseHomework{
+public class CourseHomeworkVo{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("课程编号ID")
+	private Long courseId;
+
+
+	@ApiModelProperty("课程组ID")
+	private Long courseGroupId;
+
+
+	@ApiModelProperty("上课日期")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+	private String classDate;
+
+	@ApiModelProperty("上课时间")
+	@DateTimeFormat(pattern = "HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+	private String startTime;
+
+	@ApiModelProperty("下课时间")
+	@DateTimeFormat(pattern = "HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+	private String endTime;
+
+	@ApiModelProperty("声部名称")
+	private String subjectName;
+
+	@ApiModelProperty("学员姓名")
+	private String studentName;
+
+	@ApiModelProperty("学员头像")
+	private String studentAvatar;
+
+	public Long getCourseId() {
+		return courseId;
+	}
+
+	public void setCourseId(Long courseId) {
+		this.courseId = courseId;
+	}
+
+	public Long getCourseGroupId() {
+		return courseGroupId;
+	}
+
+	public void setCourseGroupId(Long courseGroupId) {
+		this.courseGroupId = courseGroupId;
+	}
+
+	public String getClassDate() {
+		return classDate;
+	}
+
+	public void setClassDate(String classDate) {
+		this.classDate = classDate;
+	}
+
+	public String getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(String startTime) {
+		this.startTime = startTime;
+	}
+
+	public String getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(String endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	public String getStudentName() {
+		return studentName;
+	}
+
+	public void setStudentName(String studentName) {
+		this.studentName = studentName;
+	}
+
+	public String getStudentAvatar() {
+		return studentAvatar;
+	}
+
+	public void setStudentAvatar(String studentAvatar) {
+		this.studentAvatar = studentAvatar;
+	}
 }

+ 109 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -13,8 +13,8 @@
 	        <result column="completed_num_" property="completedNum" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
-		</resultMap>  
-    
+		</resultMap>
+
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_
@@ -28,18 +28,118 @@
         , t.completed_num_
         , t.create_time_
         , t.update_time_
-        </sql> 
-    
+        </sql>
+
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
         SELECT
             <include refid="baseColumns"/>
         FROM course_homework t
         where t.id_ = #{id}
     </select>
-    
-    <select id="selectPage" resultMap="BaseResultMap">
-		SELECT         
-        	<include refid="baseColumns" />
-		FROM course_homework t
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
+        select
+        cs.id_ AS courseId,
+        cs.course_group_id_ AS courseGoupId,
+        cs.class_date_ AS classDate,
+        cs.start_time_ AS startTime,
+        cs.end_time_ AS endTime
+        from course_schedule cs
+        left join course_homework ch on ch.course_schedule_id_ = cs.id_
+        <where>
+            <if test="param.decorate != null">
+                <if test="param.decorate.code == 0">
+                    and ch.id_ is null
+                </if>
+                <if test="param.decorate.code == 1">
+                    and ch.id_ is not null
+                </if>
+            </if>
+            <if test="param.courseStatus != null">
+                and cs.type_ = #{param.courseType}
+            </if>
+            <if test="param.courseType != null">
+                and cs.status_ = #{param.courseStatus}
+            </if>
+            <if test="param.teacherId != null">
+                and cs.teacher_id_ = #{param.teacherId}
+            </if>
+            <if test="param.courseScheduleId != null ">
+                and cs.id_ = #{param.courseScheduleId}
+            </if>
+        </where>
 	</select>
+
+	<select id="selectCourseHomeworkDetailByCourseId"
+            resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo">
+        select  ch.id_ as id
+        ,cs.id_ as courseScheduleId
+        ,ch.title_ as title
+        ,ch.content_ as content
+        ,ch.attachments_ as attachments
+        ,sch.attachments_ as studentAttachments
+        ,sch.teacher_replied_ as teacherReplied
+        ,sch.submit_time_ as submitTime
+        ,sch.id_ as studentHomeworkId
+        ,cs.type_ as courseType
+        ,cs.class_date_ as classDate
+        ,cs.start_time_ as startTime
+        ,cs.end_time_ as endTime
+        ,cs.status_ as courseStatus
+        ,cs.course_group_id_ as courseGroupId
+        ,if(ch.id_ is null,0,1) as decorateHomework
+        ,if(sch.attachments_ is null or sch.attachments_ = '',0,1) as submitHomework
+        ,if(sch.teacher_replied_ is null or sch.attachments_ = '',0,1) as reviewHomework
+        from course_schedule cs
+        left join course_homework ch on ch.course_schedule_id_ = cs.id_
+        left join student_course_homework sch on ch.id_ = sch.course_homework_id_
+        <where>
+            <if test="courseId != null">
+                cs.id_ = #{courseId}
+            </if>
+        </where>
+    </select>
+
+	<select id="selectPaymentStudentInfo" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo">
+        select su.username_ as studentName
+        ,su.avatar_ as stduentAvatar
+        ,s.name_ as subjectName
+        from course_group cg
+        left join subject s on cg.subject_id_ = s.id_
+        left join course_schedule_student_payment cssp on cg.id_ = cssp.course_group_id_
+        left join sys_user su on su.id_ = cssp.user_id_
+        <where>
+            <if test="courseGroupId != null">
+                and cg.id_ = #{courseGroupId}
+            </if>
+            <if test="courseScheduleId != null">
+                and cssp.course_id_ = #{courseScheduleId}
+            </if>
+        </where>
+    </select>
+
+	<select id="selectStudentInfo" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
+        select
+        s.name_ as subjectName
+        ,su.username_ as studentName
+        ,su.avatar_ as studentAvatar
+        from course_schedule_student_payment cssp
+        left join course_group cg on cssp.course_group_id_ = cg.id_
+        left join subject s on s.id_ = cg.subject_id_
+        left join sys_user su on cssp.user_id_ = su.id_
+        <where>
+            <if test="records != null and records.size() != 0">
+                and cssp.course_id_ in
+                <foreach collection="records" separator="," close=")" open="(" item="item" >
+                    #{item.courseId}
+                </foreach>
+            </if>
+        </where>
+        <if test="records != null and records.size() != 0">
+            order by field(cssp.course_id_,
+            <foreach collection="records" separator="," close=")" open="" item="item" >
+                #{item.courseId}
+            </foreach>
+        </if>
+    </select>
 </mapper>

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

@@ -182,10 +182,17 @@
 
         select count(1)
         from course_schedule cs
-        left join student_attendance sa on cs.id_ = sa.course_schedule_id_
-        left join course_homework ch on ch.course_schedule_id_ = sa.course_schedule_id_
+        left join course_homework ch on ch.course_schedule_id_ = cs.id_
         <where>
-            ch.id_ is null
+            <!-- 没有布置作业记录 -->
+            <if test="param.decorate != null">
+                <if test="param.decorate.code == 0">
+                    and ch.id_ is null
+                </if>
+                <if test="param.decorate.code == 1">
+                    and ch.id_ is not null
+                </if>
+            </if>
             <if test="param.courseStatus != null">
                 and cs.type_ = #{param.courseType}
             </if>
@@ -195,6 +202,9 @@
             <if test="param.teacherId != null">
                 and cs.teacher_id_ = #{param.teacherId}
             </if>
+            <if test="param.courseScheduleId != null ">
+                and cs.id_ = #{param.courseScheduleId}
+            </if>
         </where>
     </select>
 
@@ -220,13 +230,11 @@
             u.username_ AS userName,
             u.avatar_ AS avatar,
             g.subject_id_ AS subjectId,
-            b.name_ AS subjectName,
-            a.sign_in_time_ AS signInTime
+            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_
-        LEFT JOIN student_attendance a ON s.id_ = a.course_schedule_id_
         WHERE s.id_ IN
         (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'PRACTICE')
         <if test="param.status !=null and param.status !=''">

+ 77 - 5
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -2,17 +2,27 @@ 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.dto.CourseHomeworkReviewDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseHomeworkService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.vo.CountVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
 
 /**
  * Description 老师课后作业相关接口
@@ -31,9 +41,12 @@ public class CourseHomeworkController extends BaseController {
     @Autowired
     private CourseScheduleService courseScheduleService;
 
+    @Autowired
+    private CourseHomeworkService courseHomeworkService;
+
     @ApiOperation(value = "未布置的课后作业数量")
     @GetMapping(value="/count")
-    public HttpResponseResult<Integer> countTeacherNoDecorateHomework() {
+    public HttpResponseResult<CountVo> countTeacherNoDecorateHomework() {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
@@ -43,7 +56,66 @@ public class CourseHomeworkController extends BaseController {
         homeworkSearch.setTeacherId(sysUser.getId());
         homeworkSearch.setCourseStatus(CourseScheduleEnum.COMPLETE);
         homeworkSearch.setCourseType(CourseScheduleEnum.PRACTICE);
-        return succeed(courseScheduleService.countTeacherNoDecorateHomework(homeworkSearch));
+        homeworkSearch.setDecorate(YesOrNoEnum.NO);
+        Integer integer = courseScheduleService.countTeacherNoDecorateHomework(homeworkSearch);
+        CountVo countVo = new CountVo();
+        countVo.setCount(integer);
+        return succeed(countVo);
+    }
+
+    @ApiOperation(value = "首页-我的课程-课程详情(陪练课)-课后作业信息详情",notes = "传入课程编号ID")
+    @GetMapping(value = "/detail/{courseId}")
+    public HttpResponseResult<CourseHomeworkDetailVo> detail(@ApiParam(value = "课程编号ID", required = true)
+                                                                 @PathVariable("courseId") Long courseId) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        HttpResponseResult info = checkCourseSchedule(courseId,sysUser);
+        if (info != null) return info;
+        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId));
+    }
+
+    private HttpResponseResult checkCourseSchedule(Long courseId,SysUser sysUser) {
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (!courseScheduleService.checkCourseSchedule(sysUser.getId(), courseId)) {
+            return failed("老师只能看自己的课程详情");
+        }
+        return null;
+    }
+
+    @ApiOperation(value = "陪练课-布置作业", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/decorate", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Boolean> decorateCourseHomework(@Valid @RequestBody CourseHomeworkSaveDto saveDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        HttpResponseResult info = checkCourseSchedule(saveDto.getCourseScheduleId(),sysUser);
+        if (info != null) return info;
+        saveDto.setTeacherId(sysUser.getId());
+        return succeed(courseHomeworkService.decorateCourseHomework(saveDto));
+    }
+
+    @ApiOperation(value = "陪练课-作业点评", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/review", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Boolean> reviewCourseHomework(@Valid @RequestBody CourseHomeworkReviewDto reviewDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        HttpResponseResult info = checkCourseSchedule(reviewDto.getCourseScheduleId(),sysUser);
+        if (info != null) return info;
+        reviewDto.setTeacherId(sysUser.getId());
+        return succeed(courseHomeworkService.reviewCourseHomework(reviewDto));
+    }
+
+    @ApiOperation(value = "课后作业-列表", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/list", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<PageInfo<CourseHomeworkVo>> list(@Valid @RequestBody HomeworkSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (query.getDecorate() == null) {
+            return failed("布置状态不能为空");
+        }
+        query.setTeacherId(sysUser.getId());
+        query.setCourseStatus(CourseScheduleEnum.COMPLETE);
+        query.setCourseType(CourseScheduleEnum.PRACTICE);
+        return succeed(PageUtil.pageInfo(courseHomeworkService.selectPage(PageUtil.getPage(query),query)));
     }
 
+
 }