Browse Source

课程组查询

cy 3 years ago
parent
commit
f553a416d6

+ 40 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.vo.*;
+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.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@RestController
+@RequestMapping("/courseGroup")
+@Api(tags = "课程组")
+@Validated
+public class CourseGroupController extends BaseController {
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    @ApiOperation(value = "课程组管理-陪练课")
+    @PostMapping(value = "/practice")
+    public HttpResponseResult<PageInfo<CourseGroupPracticeVo>> selectPracticeGroup(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPracticeGroup(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "课程组管理-陪练课-详情")
+    @PostMapping(value = "/practice/detail")
+    public HttpResponseResult<PageInfo<CourseGroupPracticeDetailVo>> selectPracticeGroupDetail(@Validated @RequestBody CourseGroupDetailSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPracticeGroupDetail(PageUtil.getPage(search), search)));
+    }
+}

+ 22 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java

@@ -3,9 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.yonge.cooleshow.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.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import org.apache.ibatis.annotations.Param;
@@ -73,7 +71,7 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
      *
      * @param id 课程组id
      */
-    int opsPreStudentNum(@Param("id") Long id,@Param("num") Integer num);
+    int opsPreStudentNum(@Param("id") Long id, @Param("num") Integer num);
 
     /**
      * 查询课程组详情
@@ -92,5 +90,25 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
      */
     IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(@Param("page") IPage<LiveCourseGroupStudentCourseVo> page,
                                                                            @Param("param") LiveCourseGroupStudentCourseSearch query);
+
+    /**
+     * 查询陪练课
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPracticeVo> selectPracticeGroup(@Param("page") IPage<CourseGroupPracticeVo> page,
+                                                     @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询陪练课-详情
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPracticeDetailVo> selectPracticeGroupDetail(@Param("page") IPage<CourseGroupPracticeDetailVo> page,
+                                                                 @Param("param") CourseGroupDetailSearch search);
 }
 

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

@@ -0,0 +1,105 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupDetailSearch extends QueryInfo {
+    @ApiModelProperty(value = "课程组id")
+    @NotNull
+    private Long courseGroupId;
+    @ApiModelProperty(value = "课程编号/老师姓名/老师编号/学员姓名/学员编号")
+    private String search;
+    @ApiModelProperty(value = "老师考勤")
+    private Integer teacherSign;
+    @ApiModelProperty(value = "学生考勤")
+    private Integer studentSign;
+    @ApiModelProperty(value = "课程状态")
+    private String status;
+    @ApiModelProperty(value = "结算状态")
+    private String salaryStatus;
+    @ApiModelProperty(value = "开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+    @ApiModelProperty(value = "结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public Integer getTeacherSign() {
+        return teacherSign;
+    }
+
+    public void setTeacherSign(Integer teacherSign) {
+        this.teacherSign = teacherSign;
+    }
+
+    public Integer getStudentSign() {
+        return studentSign;
+    }
+
+    public void setStudentSign(Integer studentSign) {
+        this.studentSign = studentSign;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getSalaryStatus() {
+        return salaryStatus;
+    }
+
+    public void setSalaryStatus(String salaryStatus) {
+        this.salaryStatus = salaryStatus;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

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

@@ -0,0 +1,57 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupSearch extends QueryInfo {
+    @ApiModelProperty(value = "课程组、老师、学员编号/名称")
+    private String search;
+
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+
+    @ApiModelProperty(value = "课程状态")
+    private String status;
+
+//    @ApiModelProperty(value = "开始时间")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+//    private Date startTime;
+//
+//    @ApiModelProperty(value = "结束时间")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+//    private Date endTime;
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}

+ 17 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -7,9 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 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.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
@@ -173,5 +171,21 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
      */
     void refundCancel(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 课程组管理-陪练课
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPracticeVo> selectPracticeGroup(IPage<CourseGroupPracticeVo> page, CourseGroupSearch search);
+
+    /**
+     * 课程组管理-陪练课-详情
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPracticeDetailVo> selectPracticeGroupDetail(IPage<CourseGroupPracticeDetailVo> page, CourseGroupDetailSearch search);
 }
 

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

@@ -14,10 +14,7 @@ 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.OrderRefundReq;
 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.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -780,8 +777,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             Map<Long, String> teacherReceivers = new HashMap<>();
             teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
-                    teacherReceivers, null, 0, studentBuyLiveUrl +courseGroup.getId() , ClientEnum.TEACHER.getCode(),
-                    studentInfo.getUsername(), courseGroup.getName() );
+                    teacherReceivers, null, 0, studentBuyLiveUrl + courseGroup.getId(), ClientEnum.TEACHER.getCode(),
+                    studentInfo.getUsername(), courseGroup.getName());
             log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
 
             //短信-消息推送-老师端-通知老师有学生购买课程-无需跳转到APP
@@ -874,7 +871,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
 
         // 取消老师课酬
-        cancelTeacherSalary(studentPayment.getUserId(),studentPayment.getCourseGroupId());
+        cancelTeacherSalary(studentPayment.getUserId(), studentPayment.getCourseGroupId());
 
         // 删除学生购买记录
         buyLiveCourseCancel(orderParam);
@@ -883,19 +880,19 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     /**
      * 取消老师课酬
      *
-     * @param userId 学生id
+     * @param userId        学生id
      * @param courseGroupId 课程组id
      */
     private void cancelTeacherSalary(Long userId, Long courseGroupId) {
         List<CourseScheduleTeacherSalary> list = courseScheduleTeacherSalaryService.lambdaQuery()
-                                    .eq(CourseScheduleTeacherSalary::getStudentId,userId)
-                                    .eq(CourseScheduleTeacherSalary::getCourseGroupId, courseGroupId)
-                                    .list();
+                .eq(CourseScheduleTeacherSalary::getStudentId, userId)
+                .eq(CourseScheduleTeacherSalary::getCourseGroupId, courseGroupId)
+                .list();
         list = list.stream().filter(csts ->
-             TeacherSalaryEnum.NOT_START.getCode().equals(csts.getStatus())
-        ).peek(csts -> csts.setStatus(CourseScheduleEnum.CANCEL.getCode()))
-        .collect(Collectors.toList());
-        if(CollectionUtils.isEmpty(list)) {
+                        TeacherSalaryEnum.NOT_START.getCode().equals(csts.getStatus())
+                ).peek(csts -> csts.setStatus(CourseScheduleEnum.CANCEL.getCode()))
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(list)) {
             return;
         }
 
@@ -908,6 +905,16 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     }
 
+    @Override
+    public IPage<CourseGroupPracticeVo> selectPracticeGroup(IPage<CourseGroupPracticeVo> page, CourseGroupSearch search) {
+        return baseMapper.selectPracticeGroup(page, search);
+    }
+
+    @Override
+    public IPage<CourseGroupPracticeDetailVo> selectPracticeGroupDetail(IPage<CourseGroupPracticeDetailVo> page, CourseGroupDetailSearch search) {
+        return baseMapper.selectPracticeGroupDetail(page, search);
+    }
+
     /**
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */
@@ -961,6 +968,18 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                             .eq(CourseSchedule::getCourseGroupId, courseGroup.getId())
                             .set(CourseSchedule::getStatus, CourseScheduleEnum.CANCEL.getCode())
                     );
+                    // 直播课成课失败通知
+                    // 发短信
+                    try {
+                        SysUser user = sysUserFeignService.queryUserById(courseGroup.getTeacherId());
+                        Map<Long, String> receivers = new HashMap<>();
+                        receivers.put(user.getId(), user.getPhone());
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_LIVE_COMPLETION_FAIL,
+                                receivers, null, 0, null, null,
+                                courseGroup.getName());
+                    } catch (Exception e) {
+                        log.warn("直播课成课失败短信发送失败,{}", e.getMessage());
+                    }
                     sendMessage(courseGroup);
 
                     refend(courseGroup);
@@ -983,9 +1002,9 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
         for (String orderNo : orderNoList) {
             try {
-                userOrderRefundService.orderRefund(orderNo,"直播课成课失败退款");
+                userOrderRefundService.orderRefund(orderNo, "直播课成课失败退款");
             } catch (Exception e) {
-                log.warn("直播课成课失败退款 退款失败,退款订单号 {}",orderNo);
+                log.warn("直播课成课失败退款 退款失败,退款订单号 {}", orderNo);
             }
         }
     }
@@ -1003,9 +1022,9 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(user.getId(), user.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_LIVE_COMPLETION_FAIL,
-                               receivers, null, 0, null, null, courseGroup.getName());
+                    receivers, null, 0, null, null, courseGroup.getName());
         } catch (Exception e) {
-            log.warn("直播课成课失败短信发送失败,{}",e.getMessage());
+            log.warn("直播课成课失败短信发送失败,{}", e.getMessage());
         }
 
         // 发推送
@@ -1014,11 +1033,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(user.getId(), user.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.LIVE_COMPLETION_FAIL,
-                               receivers, null, 0, null, ClientEnum.TEACHER.getCode(), courseGroup.getName());
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), courseGroup.getName());
         } catch (Exception e) {
-            log.warn("直播课成课失败推送发送失败,{}",e.getMessage());
+            log.warn("直播课成课失败推送发送失败,{}", e.getMessage());
         }
     }
-
 }
 

+ 181 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPracticeDetailVo.java

@@ -0,0 +1,181 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupPracticeDetailVo extends BaseEntity {
+    @ApiModelProperty("陪练课id")
+    private Long courseId;
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+    @ApiModelProperty("老师姓名")
+    private String teacherName;
+    @ApiModelProperty("老师真实姓名")
+    private String teacherRealName;
+    @ApiModelProperty("学生id")
+    private Long studentId;
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+    @ApiModelProperty("学生真实姓名")
+    private String studentRealName;
+    @ApiModelProperty("课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消")
+    private String status;
+    @ApiModelProperty("开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+    @ApiModelProperty("结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+    @ApiModelProperty("老师签到状态 0:异常 1:正常")
+    private Integer teacherInSign;
+    @ApiModelProperty("老师签退状态 0:异常 1:正常")
+    private Integer teacherOutSign;
+    @ApiModelProperty("学生签到状态 0:异常 1:正常")
+    private Integer studentInSign;
+    @ApiModelProperty("学生签退状态 0:异常 1:正常")
+    private Integer studentOutSign;
+    @ApiModelProperty("NOT_START未上课、WAIT待结算、COMPLETE已结算、CANCEL已取消")
+    private String salaryStatus;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherRealName() {
+        return teacherRealName;
+    }
+
+    public void setTeacherRealName(String teacherRealName) {
+        this.teacherRealName = teacherRealName;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentRealName() {
+        return studentRealName;
+    }
+
+    public void setStudentRealName(String studentRealName) {
+        this.studentRealName = studentRealName;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getTeacherInSign() {
+        return teacherInSign;
+    }
+
+    public void setTeacherInSign(Integer teacherInSign) {
+        this.teacherInSign = teacherInSign;
+    }
+
+    public Integer getTeacherOutSign() {
+        return teacherOutSign;
+    }
+
+    public void setTeacherOutSign(Integer teacherOutSign) {
+        this.teacherOutSign = teacherOutSign;
+    }
+
+    public Integer getStudentInSign() {
+        return studentInSign;
+    }
+
+    public void setStudentInSign(Integer studentInSign) {
+        this.studentInSign = studentInSign;
+    }
+
+    public Integer getStudentOutSign() {
+        return studentOutSign;
+    }
+
+    public void setStudentOutSign(Integer studentOutSign) {
+        this.studentOutSign = studentOutSign;
+    }
+
+    public String getSalaryStatus() {
+        return salaryStatus;
+    }
+
+    public void setSalaryStatus(String salaryStatus) {
+        this.salaryStatus = salaryStatus;
+    }
+}

+ 143 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPracticeVo.java

@@ -0,0 +1,143 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupPracticeVo extends BaseEntity {
+    @ApiModelProperty("陪练课组id")
+    private Long groupId;
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+    @ApiModelProperty("课时总数")
+    private Integer courseNum;
+    @ApiModelProperty("已完成课时数")
+    private Integer completeCount;
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+    @ApiModelProperty("老师姓名")
+    private String teacherName;
+    @ApiModelProperty("老师真实姓名")
+    private String teacherRealName;
+    @ApiModelProperty("学生id")
+    private Long studentId;
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+    @ApiModelProperty("学生真实姓名")
+    private String studentRealName;
+    @ApiModelProperty("课程组状态 ING进行中 COMPLETE已完成 DISSOLVE-未成课(解散课程) CANCEL已取消-未开始报名前可取消 APPLY报名中 NOT_SALE未开售")
+    private String status;
+    @ApiModelProperty("第一节课开始时间")
+    private String startTime;
+
+    public Long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public Integer getCompleteCount() {
+        return completeCount;
+    }
+
+    public void setCompleteCount(Integer completeCount) {
+        this.completeCount = completeCount;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherRealName() {
+        return teacherRealName;
+    }
+
+    public void setTeacherRealName(String teacherRealName) {
+        this.teacherRealName = teacherRealName;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentRealName() {
+        return studentRealName;
+    }
+
+    public void setStudentRealName(String studentRealName) {
+        this.studentRealName = studentRealName;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+}

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

@@ -334,6 +334,114 @@
         </where>
         order by  cs.id_ desc
     </select>
+    <select id="selectPracticeGroup" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPracticeVo">
+        SELECT
+            cg.id_ AS groupId,
+            cg.name_ AS groupName,
+            cg.subject_id_ AS subjectId,
+            sub.name_ AS subjectName,
+            cg.course_num_ AS courseNum,
+            IFNULL(cs.count_ ,0)AS completeCount,
+            cg.teacher_id_ AS teacherId,
+            tu.username_ AS teacherName,
+            tu.real_name_ AS teacherRealName,
+            sp.user_id_ AS studentId,
+            su.username_ AS studentName,
+            su.real_name_ AS studentRealName,
+            cg.status_ AS `status`,
+            cst.start_time_ AS startTime
+        FROM course_group cg
+        LEFT JOIN `subject` sub ON cg.subject_id_=sub.id_
+        LEFT JOIN sys_user tu ON cg.teacher_id_=tu.id_
+        LEFT JOIN (SELECT user_id_,course_group_id_ FROM course_schedule_student_payment WHERE course_type_='PRACTICE' GROUP BY course_group_id_) sp ON cg.id_=sp.course_group_id_
+        LEFT JOIN sys_user su ON sp.user_id_=su.id_
+        LEFT JOIN (SELECT course_group_id_,COUNT(1) AS count_ FROM course_schedule WHERE type_='PRACTICE' AND status_='COMPLETE' GROUP BY course_group_id_) cs ON cg.id_=cs.course_group_id_
+        LEFT JOIN (SELECT course_group_id_,start_time_ FROM course_schedule WHERE type_='PRACTICE' GROUP BY course_group_id_) cst ON cg.id_=cst.course_group_id_
+        WHERE cg.type_='PRACTICE'
+        <if test="param.search != null and param.search != ''">
+            AND (
+            cg.id_ LIKE concat('%',#{param.search},'%') OR
+            cg.teacher_id_ LIKE concat('%',#{param.search},'%') OR
+            sp.user_id_ LIKE concat('%',#{param.search},'%') OR
+            cg.name_ LIKE concat('%',#{param.search},'%') OR
+            tu.username_ LIKE concat('%',#{param.search},'%') OR
+            su.username_ LIKE concat('%',#{param.search},'%')
+            )
+        </if>
+        <if test="param.subjectId != null">
+            AND cg.subject_id_ = #{param.subjectId}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND cg.status_ = #{param.status}
+        </if>
+    </select>
+    <select id="selectPracticeGroupDetail"
+            resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPracticeDetailVo">
+        SELECT * FROM
+        (SELECT
+        cs.id_ AS courseId,
+        sb.name_ AS subjectName,
+        cs.teacher_id_ AS teacherId,
+        tu.username_ AS teacherName,
+        tu.real_name_ AS teacherRealName,
+        sp.user_id_ AS studentId,
+        su.username_ AS studentName,
+        su.real_name_ AS studentRealName,
+        cs.status_ AS `status`,
+        cs.start_time_ AS startTime,
+        cs.end_time_ AS endTime,
+        (CASE WHEN cs.start_time_ &gt;= ta.sign_in_time_ THEN 1 ELSE 0 END) AS teacherInSign,
+        (CASE WHEN cs.end_time_ &lt;= ta.sign_out_time_ THEN 1 ELSE 0 END) AS teacherOutSign,
+        (CASE WHEN cs.start_time_ &gt;= sa.sign_in_time_ THEN 1 ELSE 0 END) AS studentInSign,
+        (CASE WHEN cs.end_time_ &lt;= sa.sign_out_time_ THEN 1 ELSE 0 END) AS studentOutSign,
+        ts.status_ AS salaryStatus
+        FROM course_schedule cs
+        LEFT JOIN course_group cg ON cs.course_group_id_=cg.id_
+        LEFT JOIN `subject` sb ON cg.subject_id_=sb.id_
+        LEFT JOIN sys_user tu ON cs.teacher_id_=tu.id_
+        LEFT JOIN course_schedule_student_payment sp ON cs.id_=sp.course_id_
+        LEFT JOIN sys_user su ON sp.user_id_=su.id_
+        LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_
+        LEFT JOIN student_attendance sa ON cs.id_=sa.course_schedule_id_
+        LEFT JOIN course_schedule_teacher_salary ts ON cs.id_=ts.course_schedule_id_
+        WHERE cs.type_='PRACTICE'
+        AND cs.course_group_id_=#{param.courseGroupId}) a
+        <where>
+            <if test="param.search != null and param.search != ''">
+                AND (
+                courseId LIKE concat('%',#{param.search},'%') OR
+                teacherName LIKE concat('%',#{param.search},'%') OR
+                teacherId LIKE concat('%',#{param.search},'%') OR
+                studentName LIKE concat('%',#{param.search},'%') OR
+                studentId LIKE concat('%',#{param.search},'%')
+                )
+            </if>
+            <if test="param.teacherSign == 1">
+                AND teacherInSign = #{param.teacherSign}
+            </if>
+            <if test="param.teacherSign == 0">
+                AND teacherOutSign = #{param.teacherSign}
+            </if>
+            <if test="param.studentSign == 1">
+                AND studentInSign = #{param.studentSign}
+            </if>
+            <if test="param.studentSign == 0">
+                AND studentOutSign = #{param.studentSign}
+            </if>
+            <if test="param.status != null and param.status != ''">
+                AND `status` = #{param.status}
+            </if>
+            <if test="param.salaryStatus != null and param.salaryStatus != ''">
+                AND salaryStatus = #{param.salaryStatus}
+            </if>
+            <if test="param.startTime != null">
+                AND startTime &lt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                AND endTime &gt;= #{param.endTime}
+            </if>
+        </where>
+    </select>
 
     <update id="opsPreStudentNum">
         update course_group