소스 검색

Merge remote-tracking branch 'origin/master'

liweifan 3 년 전
부모
커밋
487d6fe0d7
18개의 변경된 파일1028개의 추가작업 그리고 31개의 파일을 삭제
  1. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  2. 46 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java
  3. 32 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java
  4. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  5. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  6. 105 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupDetailSearch.java
  7. 57 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java
  8. 25 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  9. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  10. 119 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  11. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  12. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  13. 133 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupLiveVo.java
  14. 181 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPracticeDetailVo.java
  15. 143 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPracticeVo.java
  16. 143 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  17. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  18. 7 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

+ 1 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java

@@ -94,7 +94,7 @@ public class NewsController extends BaseController {
 			return failed("章节不能为空");
 		}
 		// 1 2 3 4 5
-		if (newsInfo.getType() != 2) {
+		if (newsInfo.getType() != 2 && newsInfo.getType() !=6) {
 			if (StringUtil.isEmpty(newsInfo.getCoverImage())) {
 				return failed("封面不能为空");
 			}

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

@@ -0,0 +1,46 @@
+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)));
+    }
+
+    @ApiOperation(value = "课程组管理-直播课")
+    @PostMapping(value = "/live")
+    public HttpResponseResult<PageInfo<CourseGroupLiveVo>> selectLiveGroup(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectLiveGroup(PageUtil.getPage(search), search)));
+    }
+}

+ 32 - 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,35 @@ 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);
+
+    /**
+     * 查询直播课
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupLiveVo> selectLiveGroup(@Param("page") IPage<CourseGroupLiveVo> page,
+                                             @Param("param") CourseGroupSearch search);
 }
 

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

@@ -102,6 +102,8 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     //学生端-首页-陪练课老师列表
     List<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, @Param("param") PracticeTeacherSearch search);
 
+    List<Long> teacherIdList();
+
     //学生端-课表-日历-用户
     List<CourseStudent> queryCourseTeacher(@Param("param") MyCourseSearch search);
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -46,5 +46,13 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
 
     //根据查询锁定中的课程
     List<CourseScheduleStudentPaymentVo> selectPaymentList(String orderNo);
+
+    /**
+     * 查询购买直播课的订单
+     *
+     * @param courseGroupId 课程组id
+     * @return
+     */
+    List<String> selectOrderNoByGroupId(Long courseGroupId);
 }
 

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

+ 25 - 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,29 @@ 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);
+
+    /**
+     * 课程组管理-直播课
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupLiveVo> selectLiveGroup(IPage<CourseGroupLiveVo> page, CourseGroupSearch search);
 }
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -37,5 +37,13 @@ public interface CourseScheduleStudentPaymentService extends IService<CourseSche
      * @return 购买记录
      */
     CourseScheduleStudentPayment getByCourseId(Long courseId);
+
+    /**
+     * 查询购买直播课的订单
+     *
+     * @param courseGroupId 课程组
+     * @return
+     */
+    List<String> getOrderNoByGroupId( Long courseGroupId);
 }
 

+ 119 - 21
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.*;
@@ -90,6 +87,9 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private UserOrderRefundService userOrderRefundService;
+
     @Override
     public CourseGroupDao getDao() {
         return this.baseMapper;
@@ -777,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
@@ -851,8 +851,52 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     }
 
+    /**
+     * 学生购买直播课程-成功-回调
+     */
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void refundSuccess(UserOrderDetailVo userOrderDetailVo) {
+    public void refundSuccess(UserOrderDetailVo orderParam) {
+        log.info("refundSuccess");
+        String orderNo = orderParam.getOrderNo();
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
+        );
+        CourseScheduleStudentPayment studentPayment;
+        if (CollectionUtils.isEmpty(studentPaymentList)) {
+            log.info("buyLiveCourseSuccess >>> 订单不存在!orderParam: {}", JSON.toJSONString(orderParam));
+            throw new BizException("订单不存在");
+        } else {
+            studentPayment = studentPaymentList.get(0);
+        }
+
+        // 取消老师课酬
+        cancelTeacherSalary(studentPayment.getUserId(), studentPayment.getCourseGroupId());
+
+        // 删除学生购买记录
+        buyLiveCourseCancel(orderParam);
+    }
+
+    /**
+     * 取消老师课酬
+     *
+     * @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();
+        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)) {
+            return;
+        }
+
+        courseScheduleTeacherSalaryService.saveOrUpdateBatch(list);
 
     }
 
@@ -861,6 +905,21 @@ 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);
+    }
+
+    @Override
+    public IPage<CourseGroupLiveVo> selectLiveGroup(IPage<CourseGroupLiveVo> page, CourseGroupSearch search) {
+        return baseMapper.selectLiveGroup(page,search);
+    }
+
     /**
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */
@@ -921,23 +980,15 @@ 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());
                     }
+                    sendMessage(courseGroup);
+
+                    refend(courseGroup);
 
-                    // 发推送
-                    try {
-                        SysUser user = sysUserFeignService.queryUserById(courseGroup.getTeacherId());
-                        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());
-                    } catch (Exception e) {
-                        log.warn("直播课成课失败推送发送失败,{}",e.getMessage());
-                    }
                 }
                 this.updateById(courseGroup);
             } catch (Exception ignored) {
@@ -945,5 +996,52 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         });
     }
 
+    /**
+     * 直播课成课失败退款
+     *
+     * @param courseGroup
+     */
+    private void refend(CourseGroup courseGroup) {
+        // 退款
+        List<String> orderNoList = courseScheduleStudentPaymentService.getOrderNoByGroupId(courseGroup.getId());
+
+        for (String orderNo : orderNoList) {
+            try {
+                userOrderRefundService.orderRefund(orderNo, "直播课成课失败退款");
+            } catch (Exception e) {
+                log.warn("直播课成课失败退款 退款失败,退款订单号 {}", orderNo);
+            }
+        }
+    }
+
+    /**
+     * 直播课成课失败发送消息
+     *
+     * @param courseGroup 课程组
+     */
+    private void sendMessage(CourseGroup courseGroup) {
+        // 直播课成课失败通知
+        // 发短信
+        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());
+        }
+
+        // 发推送
+        try {
+            SysUser user = sysUserFeignService.queryUserById(courseGroup.getTeacherId());
+            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());
+        } catch (Exception e) {
+            log.warn("直播课成课失败推送发送失败,{}", e.getMessage());
+        }
+    }
 }
 

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

@@ -782,9 +782,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     @Override
     public IPage<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, PracticeTeacherSearch search) {
         if (search.getScreen() != null && search.getScreen()) {
-            search.setTeacherIdList(getTeacherId(30));
+            List<Long> teacherIdList = getTeacherId(30);
+            if (CollectionUtils.isEmpty(teacherIdList)){
+                return null;
+            }
+            search.setTeacherIdList(teacherIdList);
             return page.setRecords(baseMapper.teacherList(page, search));
         } else {
+            search.setTeacherIdList(baseMapper.teacherIdList());
             return page.setRecords(baseMapper.teacherList(page, search));
         }
     }

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

@@ -57,5 +57,12 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
         return list.get(0);
     }
 
+    @Override
+    public List<String> getOrderNoByGroupId(Long courseGroupId) {
+
+        return baseMapper.selectOrderNoByGroupId(courseGroupId);
+
+    }
+
 }
 

+ 133 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupLiveVo.java

@@ -0,0 +1,133 @@
+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 CourseGroupLiveVo extends BaseEntity {
+    @ApiModelProperty("直播课组id")
+    private Long courseGroupId;
+    @ApiModelProperty("直播课组名称")
+    private String courseGroupName;
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+    @ApiModelProperty("预计购课人数")
+    private Integer studentNum;
+    @ApiModelProperty("课时总数")
+    private Integer courseNum;
+    @ApiModelProperty("已完成课时数")
+    private Integer completeCount;
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+    @ApiModelProperty("老师姓名")
+    private String teacherName;
+    @ApiModelProperty("老师真实姓名")
+    private String teacherRealName;
+    @ApiModelProperty("课程组状态 ING进行中 COMPLETE已完成 DISSOLVE-未成课(解散课程) CANCEL已取消-未开始报名前可取消 APPLY报名中 NOT_SALE未开售")
+    private String status;
+    @ApiModelProperty("第一节课开始时间")
+    private String startTime;
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public String getCourseGroupName() {
+        return courseGroupName;
+    }
+
+    public void setCourseGroupName(String courseGroupName) {
+        this.courseGroupName = courseGroupName;
+    }
+
+    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 getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    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 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;
+    }
+}

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

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

@@ -334,6 +334,149 @@
         </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>
+    <select id="selectLiveGroup" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupLiveVo">
+        SELECT
+            cg.id_ AS courseGroupId,
+            cg.name_ AS courseGroupName,
+            cg.subject_id_ AS subjectId,
+            sb.name_ AS subjectName,
+            cg.teacher_id_ AS teacherId,
+            su.username_ AS teacherName,
+            su.real_name_ AS teacherRealName,
+            cg.course_num_ AS courseNum,
+            cg.pre_student_num_ AS studentNum,
+            cg.status_ AS `status`,
+            IFNULL(cm.count_,0) AS completeCount,
+            st.start_time_ AS startTime
+        FROM course_group cg
+        LEFT JOIN `subject` sb ON cg.subject_id_=sb.id_
+        LEFT JOIN sys_user su ON su.id_=cg.teacher_id_
+        LEFT JOIN (SELECT course_group_id_,COUNT(1) AS count_ FROM course_schedule WHERE type_='LIVE' AND status_='COMPLETE' GROUP BY course_group_id_) cm ON cg.id_=cm.course_group_id_
+        LEFT JOIN (SELECT course_group_id_,start_time_ FROM course_schedule WHERE type_='LIVE' GROUP BY course_group_id_) st ON cg.id_=st.course_group_id_
+        WHERE cg.type_='LIVE'
+        <if test="param.search != null and param.search != ''">
+            AND (
+            cg.id_ LIKE concat('%',#{param.search},'%') OR
+            cg.teacher_id_ LIKE concat('%',#{param.search},'%') OR
+            cg.name_ 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>
 
     <update id="opsPreStudentNum">
         update course_group

+ 5 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -398,7 +398,7 @@
         WHERE f.default_flag_=1
         AND p.subject_id_=#{param.subjectId}) sp ON t.user_id_=sp.teacherId
 
-        WHERE t.user_id_ IN (SELECT teacher_id_ FROM teacher_free_time GROUP BY teacher_id_)
+        <where>
         <if test="param.teacherIdList != null and param.teacherIdList.size>0">
             AND t.user_id_ IN
             <foreach collection="param.teacherIdList" item="item" open="(" separator="," close=")">
@@ -416,6 +416,7 @@
                 ORDER BY ${param.sort}
             </when>
         </choose>
+        </where>
     </select>
 
     <select id="queryCourseTeacher" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudent"
@@ -765,6 +766,9 @@
             WHERE user_id_=(SELECT user_id_ FROM course_schedule_student_payment WHERE course_id_=#{courseId} AND course_type_='PRACTICE')
         )
     </select>
+    <select id="teacherIdList" resultType="java.lang.Long">
+        SELECT teacher_id_ FROM teacher_free_time GROUP BY teacher_id_
+    </select>
     <update id="updateStartTime">
         UPDATE course_schedule SET status_='ING' WHERE status_ != 'CANCEL' <![CDATA[ AND start_time_ <= NOW() ]]> <![CDATA[ AND NOW() <= end_time_ ]]>
     </update>

+ 7 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -80,4 +80,11 @@
         LEFT JOIN course_schedule s ON p.course_id_ = s.id_
         WHERE p.order_no_=#{orderNo}
     </select>
+
+    <select id="selectOrderNoByGroupId" resultType="java.lang.String">
+        select
+        distinct order_no_
+        from course_schedule_student_payment cssp
+        where cssp.course_group_id_ = #{courseGroupId}
+    </select>
 </mapper>