فهرست منبع

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
liweifan 3 سال پیش
والد
کامیت
c1b482e985
38فایلهای تغییر یافته به همراه921 افزوده شده و 167 حذف شده
  1. 5 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  2. 4 4
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java
  3. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  4. 2 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java
  5. 5 5
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  6. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java
  7. 3 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  8. 101 11
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java
  9. 49 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java
  10. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java
  11. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupDetailSearch.java
  12. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleRecord.java
  13. 59 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  14. 53 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  15. 8 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  16. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  17. 58 44
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  18. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  19. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java
  20. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseCompleteVo.java
  21. 80 56
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPianoDetailVo.java
  22. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleStudentVo.java
  23. 78 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentSignVo.java
  24. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonAuthGroup.java
  25. 249 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  26. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  27. 8 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  28. 13 19
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRecordMapper.xml
  29. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  30. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  31. 7 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  32. 4 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPracticeRecordMapper.xml
  33. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  34. 1 1
      cooleshow-user/user-student/src/main/resources/logback-spring.xml
  35. 2 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  36. 1 1
      cooleshow-user/user-teacher/src/main/resources/logback-spring.xml
  37. 1 7
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenVideoGroupController.java
  38. 33 0
      toolset/toolset-mybatis/src/main/java/com/yonge/toolset/mybatis/config/MyBatisPlusConfig.java

+ 5 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -174,6 +174,10 @@ public interface SysConfigConstant {
 
     /** 老师分享曲目二维码跳转链接 */
     String TEACHER_MUSIC_SHEET_SHARE_URL = "teacher_music_sheet_share_url";
+    /**
+     * 琴房课扣时公式
+     */
+    String PIANO_ROOM_TIME_FORMULA = "piano_room_time_formula";
 
     /** 公司名称 */
     String COMPANY_NAME = "company_name";
@@ -181,4 +185,5 @@ public interface SysConfigConstant {
     String COMPANY_SEAL_PICTURE = "company_seal_picture";
     /** 统一社会信用代码 */
     String COMPANY_ORGAN_CODE = "company_organ_code";
+
 }

+ 4 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java

@@ -31,10 +31,10 @@ public class OmsCartItemController {
     @ApiOperation("添加商品到购物车")
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult add(@RequestBody OmsCartItem cartItem) {
-        int count = cartItemService.add(cartItem);
-        if (count > 0) {
-            return CommonResult.success(count);
+    public CommonResult<OmsCartItem> add(@RequestBody OmsCartItem cartItem) {
+        OmsCartItem omsCartItem = cartItemService.add(cartItem);
+        if (omsCartItem != null) {
+            return CommonResult.success(omsCartItem);
         }
         return CommonResult.failed();
     }

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -144,6 +145,7 @@ public class PaymentController extends BaseController {
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
                 OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
                 PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+        log.info("支付回调整理后的信息 : {}", JSON.toJSONString(res));
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
 

+ 2 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java

@@ -14,9 +14,10 @@ import java.util.List;
 public interface OmsCartItemService {
     /**
      * 查询购物车中是否包含该商品,有增加数量,无添加到购物车
+     * @return
      */
     @Transactional
-    int add(OmsCartItem cartItem);
+    OmsCartItem add(OmsCartItem cartItem);
 
     /**
      * 根据会员编号获取购物车列表

+ 5 - 5
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -44,8 +44,7 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     private PmsSkuStockMapper skuStockMapper;
 
     @Override
-    public int add(OmsCartItem cartItem) {
-        int count;
+    public OmsCartItem add(OmsCartItem cartItem) {
         UmsMember currentMember =memberService.getCurrentMember();
         cartItem.setMemberId(currentMember.getId());
         cartItem.setMemberNickname(currentMember.getNickname());
@@ -76,13 +75,14 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             }
 
             cartItem.setCreateDate(new Date());
-            count = cartItemMapper.insert(cartItem);
+            cartItemMapper.insert(cartItem);
+            return cartItem;
         } else {
             cartItem.setModifyDate(new Date());
             existCartItem.setQuantity(existCartItem.getQuantity() + cartItem.getQuantity());
-            count = cartItemMapper.updateByPrimaryKey(existCartItem);
+            cartItemMapper.updateByPrimaryKey(existCartItem);
         }
-        return count;
+        return existCartItem;
     }
 
     /**

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java

@@ -133,6 +133,8 @@ public class OmsPortalOrderReturnApplyServiceImpl implements OmsPortalOrderRetur
 
     @Override
     public void refundPaymentCallBack(PaymentCallBack data) {
+
+        log.info("退款回调信息: {}",JSON.toJSONString(data));
         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//退款成功
             paymentRefundSucceededHandle(data);
         } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//退款失败

+ 3 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -645,6 +645,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Override
     public void executePaymentCallBack(PaymentCallBack data) {
+        LOG.info("支付回调信息: {}",JSON.toJSONString(data));
         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
             paymentSucceededHandle(data);
         } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
@@ -654,6 +655,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Override
     public void closePaymentCallBack(PaymentCallBack data) {
+
+        LOG.info("关单回调信息: {}",JSON.toJSONString(data));
         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
             paymentCloseSucceededHandle(data);
         } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败

+ 101 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupSearch;
-import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -13,11 +15,12 @@ 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.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotNull;
-import java.util.Map;
+import java.util.List;
 
 /**
  * @Author: cy
@@ -30,6 +33,10 @@ import java.util.Map;
 public class CourseGroupController extends BaseController {
     @Autowired
     private CourseGroupService courseGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
 
     @ApiOperation(value = "课程组管理-陪练课",notes = "{\n" +
             "    \"subjectId\":20,\n" +
@@ -129,22 +136,105 @@ public class CourseGroupController extends BaseController {
             "    \"status\":\"ING\"\n" +
             "}")
     @PostMapping(value = "/piano")
-    public HttpResponseResult<PageInfo<CourseGroupPianoVo>> selectLiveGroupInfo(@RequestBody CourseGroupSearch search) {
+    public HttpResponseResult<PageInfo<CourseGroupPianoVo>> selectPianoGroup(@RequestBody CourseGroupSearch search) {
         return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroup(PageUtil.getPage(search), search)));
     }
 
     @ApiOperation(value = "课程组管理-琴房课-详情",notes = "{\n" +
-            "    \"courseGroupId\": 140,\n" +
-            "    \"teacherSign\": 0,\n" +
-            "    \"studentSign\": 0,\n" +
-            "    \"search\": \"游\",\n" +
-            "    \"status\": \"COMPLETE\",\n" +
-            "    \"salaryStatus\": \"NOT_START\",\n" +
-            "    \"startTime\": \"2022-05-21 08:00:00\",\n" +
-            "    \"endTime\": \"\"\n" +
+            "    \"courseGroupId\":334,\n" +
+            "    \"search\":\"\",\n" +
+            "    \"status\":\"\",\n" +
+            "    \"startTime\":null,\n" +
+            "    \"endTime\":null,\n" +
+            "    \"teacherSign\":null,\n" +
+            "    \"studentSign\":null\n" +
             "}")
     @PostMapping(value = "/piano/detail")
     public HttpResponseResult<PageInfo<CourseGroupPianoDetailVo>> selectPianoGroupDetail(@Validated @RequestBody CourseGroupDetailSearch search) {
         return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroupDetail(PageUtil.getPage(search), search)));
     }
+
+    @ApiOperation(value = "课程组管理-琴房课-详情-学员名单")
+    @GetMapping(value = "/piano/student")
+    public HttpResponseResult<List<StudentSignVo>> studentSign(@NotNull Long courseId) {
+        return succeed(courseGroupService.studentSign(courseId,null));
+    }
+
+    @ApiOperation(value = "学员管理-琴房课",notes = "{\n" +
+            "    \"subjectId\":20,\n" +
+            "    \"search\":\"师\",\n" +
+            "    \"status\":\"ING\"\n" +
+            "}")
+    @PostMapping(value = "/piano/student")
+    public HttpResponseResult<PageInfo<CourseGroupPianoVo>> selectPianoGroupStudent(@RequestBody CourseGroupSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setStudentId(user.getId());
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroupStudent(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "学员管理-琴房课-详情",notes = "{\n" +
+            "    \"courseGroupId\":334,\n" +
+            "    \"search\":\"\",\n" +
+            "    \"status\":\"\",\n" +
+            "    \"startTime\":null,\n" +
+            "    \"endTime\":null,\n" +
+            "    \"teacherSign\":0,\n" +
+            "    \"studentSign\":0\n" +
+            "}")
+    @PostMapping(value = "/piano/student/detail")
+    public HttpResponseResult<PageInfo<CourseGroupPianoDetailVo>> selectPianoGroupStudentDetail(@Validated @RequestBody CourseGroupDetailSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setStudentId(user.getId());
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroupStudentDetail(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation("查询琴房剩余时长、冻结时长、统计学员人数")
+    @GetMapping("/selectRemainTime")
+    public HttpResponseResult<PianoRoomTimeVo> selectRemainTime() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseScheduleService.selectRemainTime(user.getId()));
+    }
+
+    @ApiOperation(value = "老师管理-琴房课",notes = "{\n" +
+            "    \"subjectId\":20,\n" +
+            "    \"search\":\"师\",\n" +
+            "    \"status\":\"ING\"\n" +
+            "}")
+    @PostMapping(value = "/piano/teacher")
+    public HttpResponseResult<PageInfo<CourseGroupPianoVo>> selectPianoGroupTeacher(@RequestBody CourseGroupSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setTeacherId(user.getId());
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroupTeacher(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "老师管理-琴房课-详情",notes = "{\n" +
+            "    \"courseGroupId\":334,\n" +
+            "    \"search\":\"\",\n" +
+            "    \"status\":\"\",\n" +
+            "    \"startTime\":null,\n" +
+            "    \"endTime\":null,\n" +
+            "    \"teacherSign\":0,\n" +
+            "    \"studentSign\":0\n" +
+            "}")
+    @PostMapping(value = "/piano/teacher/detail")
+    public HttpResponseResult<PageInfo<CourseGroupPianoDetailVo>> selectPianoGroupTeacherDetail(@Validated @RequestBody CourseGroupDetailSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setTeacherId(user.getId());
+        return succeed(PageUtil.pageInfo(courseGroupService.selectPianoGroupTeacherDetail(PageUtil.getPage(search), search)));
+    }
 }

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

@@ -206,5 +206,54 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
      */
     IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
                                                            @Param("param") CourseGroupDetailSearch search);
+
+    /**
+     * 查询琴房课学员考勤
+     *
+     * @param courseId
+     * @param type
+     * @return
+     */
+    List<StudentSignVo> studentSign(@Param("courseId") Long courseId, @Param("type") String type);
+
+    /**
+     * 根据学员查询琴房课组
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoVo> selectPianoGroupStudent(@Param("page") IPage<CourseGroupPianoVo> page,
+                                                      @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询琴房课详情
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
+                                                                  @Param("param") CourseGroupDetailSearch search);
+
+    /**
+     * 根据老师查询琴房课组
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoVo> selectPianoGroupTeacher(@Param("page") IPage<CourseGroupPianoVo> page,
+                                                      @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询琴房课详情
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
+                                                                  @Param("param") CourseGroupDetailSearch search);
 }
 

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentVo;
 import com.yonge.cooleshow.biz.dal.vo.MyRepliedVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied;
@@ -39,6 +40,8 @@ public interface CourseScheduleRepliedDao extends BaseMapper<CourseScheduleRepli
 
     List<Long> selectAll();
 
+    List<Long> selectReplyStudent();
+
     List<Long> selectAllClass();
 
 	/**
@@ -61,4 +64,6 @@ public interface CourseScheduleRepliedDao extends BaseMapper<CourseScheduleRepli
 	 * @Date: 2022/4/19
 	 */
     CourseRepliedVo selectReplied(CourseScheduleReplied replied);
+
+    void insertBatch(List<CourseScheduleStudentVo> list);
 }

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

@@ -8,6 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @Author: cy
@@ -16,7 +17,7 @@ import java.util.Date;
 @ApiModel
 public class CourseGroupDetailSearch extends QueryInfo {
     @ApiModelProperty(value = "课程组id")
-    @NotNull
+    @NotNull(message = "课程组id不能为空")
     private Long courseGroupId;
     @ApiModelProperty(value = "课程编号/老师姓名/老师编号/学员姓名/学员编号")
     private String search;
@@ -40,6 +41,16 @@ public class CourseGroupDetailSearch extends QueryInfo {
     private Long studentId;
     @ApiModelProperty(value = "老师id")
     private Long teacherId;
+    @ApiModelProperty(value = "课程id集合")
+    private List<Long> courseIds;
+
+    public List<Long> getCourseIds() {
+        return courseIds;
+    }
+
+    public void setCourseIds(List<Long> courseIds) {
+        this.courseIds = courseIds;
+    }
 
     public Long getStudentId() {
         return studentId;

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleRecord.java

@@ -47,6 +47,18 @@ public class CourseScheduleRecord implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "单课时长")
+    private Integer singleCourseTime;
+
+    public Integer getSingleCourseTime() {
+        return singleCourseTime;
+    }
+
+    public void setSingleCourseTime(Integer singleCourseTime) {
+        this.singleCourseTime = singleCourseTime;
+    }
+
     public Date getEndTime() {
         return endTime;
     }

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

@@ -146,6 +146,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * <p>定时将符合结束售卖日期的在售卖中的直播课课程组修改为取消或者成课状态状态-每隔10分钟执行一次
      */
     void opsCourseGroup();
+
     /***
      * 直播课退款单-创建前
      * @param: refundReq
@@ -153,6 +154,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
      */
     HttpResponseResult<RefundCreateRes> refundCreate(OrderRefundReq refundReq);
+
     /***
      * 直播课退款单-创建后
      * @param: userOrderRefund
@@ -160,6 +162,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
      */
     void refundAfter(UserOrderDetailVo userOrderDetailVo);
+
     /***
      * 直播课退款单-退款成功
      * @param: userOrderRefund
@@ -167,6 +170,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
      */
     void refundSuccess(UserOrderDetailVo userOrderDetailVo);
+
     /***
      * 直播课退款单-退款失败
      * @param: userOrderRefund
@@ -177,6 +181,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-陪练课
+     *
      * @param page
      * @param search
      * @return
@@ -185,6 +190,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-陪练课-详情
+     *
      * @param page
      * @param search
      * @return
@@ -193,6 +199,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-直播课
+     *
      * @param page
      * @param search
      * @return
@@ -201,6 +208,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-直播课-购买学员
+     *
      * @param page
      * @param search
      * @return
@@ -209,6 +217,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-直播课-教学计划
+     *
      * @param page
      * @param search
      * @return
@@ -217,6 +226,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-视频课
+     *
      * @param page
      * @param search
      * @return
@@ -225,6 +235,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-视频课-购买学员
+     *
      * @param page
      * @param search
      * @return
@@ -233,6 +244,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-视频课-教学计划
+     *
      * @param page
      * @param search
      * @return
@@ -241,6 +253,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-直播课-课程信息
+     *
      * @param groupId
      * @return
      */
@@ -248,6 +261,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-琴房课
+     *
      * @param page
      * @param search
      * @return
@@ -256,10 +270,55 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     /**
      * 课程组管理-琴房课-详情
+     *
      * @param page
      * @param search
      * @return
      */
     IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);
+
+    /**
+     * 课程组管理-琴房课-详情-学员名单
+     *
+     * @param courseId
+     * @return
+     */
+    List<StudentSignVo> studentSign(Long courseId, String type);
+
+    /**
+     * 学员管理-琴房课
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoVo> selectPianoGroupStudent(IPage<CourseGroupPianoVo> page, CourseGroupSearch search);
+
+    /**
+     * 学员管理-琴房课-详情
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);
+
+    /**
+     * 老师管理-琴房课
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoVo> selectPianoGroupTeacher(IPage<CourseGroupPianoVo> page, CourseGroupSearch search);
+
+    /**
+     * 老师管理-琴房课-详情
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);
 }
 

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

@@ -1097,13 +1097,65 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
     }
 
+    @Override
     public IPage<CourseGroupPianoVo> selectPianoGroup(IPage<CourseGroupPianoVo> page, CourseGroupSearch search) {
         return baseMapper.selectPianoGroup(page, search);
     }
 
     @Override
     public IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
-        return baseMapper.selectPianoGroupDetail(page,search);
+        if (search.getStudentSign() != null) {
+            List<StudentSignVo> list = studentSign(null, CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+            List<Long> collect=new ArrayList<>();
+            if (search.getStudentSign() == 0) {//异常学生
+                collect = list.stream().filter(s -> (s.getStudentOutSign() + s.getStudentInSign()) != 2).map(StudentSignVo::getCourseId).collect(Collectors.toList());
+            }
+            if (search.getStudentSign() == 1) {//正常学生
+                collect = list.stream().filter(s -> (s.getStudentOutSign() + s.getStudentInSign()) == 2).map(StudentSignVo::getCourseId).collect(Collectors.toList());
+            }
+            collect.add(Long.valueOf(-1));
+            search.setCourseIds(collect);
+        }
+
+        IPage<CourseGroupPianoDetailVo> pianoGroupDetail = baseMapper.selectPianoGroupDetail(page, search);
+        List<CourseGroupPianoDetailVo> records = pianoGroupDetail.getRecords();
+
+        for (CourseGroupPianoDetailVo record : records) {
+            List<StudentSignVo> studentSigns = studentSign(record.getCourseId(), null);
+            for (StudentSignVo studentSign : studentSigns) {
+                if ((studentSign.getStudentInSign() + studentSign.getStudentOutSign()) == 2) {//签到正常
+                    record.setStudentSign(1);
+                } else {//签到异常
+                    record.setStudentSign(0);
+                }
+            }
+        }
+        return pianoGroupDetail;
+    }
+
+    @Override
+    public List<StudentSignVo> studentSign(Long courseId, String type) {
+        return baseMapper.studentSign(courseId, type);
+    }
+
+    @Override
+    public IPage<CourseGroupPianoVo> selectPianoGroupStudent(IPage<CourseGroupPianoVo> page, CourseGroupSearch search) {
+        return baseMapper.selectPianoGroupStudent(page, search);
+    }
+
+    @Override
+    public IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
+        return baseMapper.selectPianoGroupStudentDetail(page,search);
+    }
+
+    @Override
+    public IPage<CourseGroupPianoVo> selectPianoGroupTeacher(IPage<CourseGroupPianoVo> page, CourseGroupSearch search) {
+        return baseMapper.selectPianoGroupTeacher(page,search);
+    }
+
+    @Override
+    public IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
+        return baseMapper.selectPianoGroupTeacherDetail(page,search);
     }
 }
 

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

@@ -26,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeworkVo;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -233,6 +234,8 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         }
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_DECORATE_HOMEWORK.getCode());
+
+        url = MessageFormatter.arrayFormat(url, courseScheduleId);
         for (CourseScheduleStudentPayment courseScheduleStudentPayment : paymentList) {
             SysUser student = sysUserFeignService.queryUserById(courseScheduleStudentPayment.getUserId());
             Map<Long,String> studentReceivers = new HashMap<>();
@@ -240,7 +243,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum
-                       .TEACHER_DECORATE_HOMEWORK,studentReceivers, null, 0,url + courseScheduleId ,
+                       .TEACHER_DECORATE_HOMEWORK,studentReceivers, null, 0,url ,
                        ClientEnum.STUDENT.getCode(),teacher.getUsername());
             } catch (Exception e) {
                 log.warn("老师布置作业消息发送失败  学生id:{}",student.getId());
@@ -302,6 +305,8 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         Map<Long,String> studentReceivers = new HashMap<>();
         studentReceivers.put(student.getId(), student.getPhone());
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_REVIEW_HOMEWORK.getCode());
+
+        url = MessageFormatter.arrayFormat(url, reviewDto.getCourseScheduleId());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_REVIEW_HOMEWORK,
         studentReceivers, null, 0, url + reviewDto.getCourseScheduleId() , ClientEnum.STUDENT.getCode(), teacher.getUsername());
     }
@@ -356,9 +361,9 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         receivers.put(teacher.getId(), teacher.getPhone());
 
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK.getCode());
-
+        url = MessageFormatter.arrayFormat(url, submitDto.getCourseScheduleId(),student.getId());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK,
-        receivers, null, 0, url + submitDto.getCourseScheduleId(), ClientEnum.TEACHER.getCode(), student.getUsername());
+        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), student.getUsername());
     }
 
     @Override

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

@@ -77,7 +77,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         }
 
         //当前用户为老师
-        if (userId == courseSchedule.getTeacherId()) {
+        if (userId.equals(courseSchedule.getTeacherId())) {
             if (studentId == null) {
                 throw new RuntimeException("评价的学生id不能为空");
             }

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

@@ -44,6 +44,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
@@ -661,30 +664,26 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Date: 2022/4/11
      */
     public IPage<MyCourseVo> queryTeacherPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search) {
-        //查询所有已评价学生id
-        List<Long> studentList = repliedDao.selectAll();
-
         Integer replied = search.getReplied();
         if (replied != null) {
-            //按评价筛选 0:未评价 1:已评价
-            if (replied == 0) {
-                if (CollectionUtils.isEmpty(studentList)) {
-                    search.setRepliedIds(null);
-                } else {
-                    search.setRepliedIds(studentList);
-                }
+            //查询所有已评价学生id
+            List<Long> replyStudent = repliedDao.selectReplyStudent();
+            //查询所有购课用户
+            List<Long> userList = paymentDao.selectAll();
+
+            if (CollectionUtils.isEmpty(userList)) {
+                return page.setRecords(new ArrayList<>());
             }
 
-            if (replied == 1) {
-                //查询所有购课用户
-                List<Long> userList = paymentDao.selectAll();
-                //取差集
-                userList.removeAll(studentList);
-                if (CollectionUtils.isEmpty(userList)) {
-                    return page.setRecords(new ArrayList<>());
-                }
+            if (replied == 0) {//未评价
+                userList.removeAll(replyStudent);
                 search.setRepliedIds(userList);
             }
+
+            if (replied == 1) {//已评价
+                replyStudent.add(Long.valueOf(-1));
+                search.setRepliedIds(replyStudent);
+            }
             search.setStatus(CourseScheduleEnum.COMPLETE.getCode());
         }
         return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));
@@ -1130,7 +1129,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
                 .eq(CourseSchedule::getType, CourseScheduleEnum.PRACTICE));
         if (ObjectUtil.isEmpty(schedule)) {
-            throw new BizException("课程不存在");
+            throw new BizException("无法调整该课程");
         }
 
         //查询是否有人购买
@@ -1530,6 +1529,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //课程结束(NOW ≥ 结束时间)
         List<CourseScheduleStudentVo> userList = paymentDao.selectUser();
         if (CollectionUtils.isNotEmpty(userList)) {
+            List<CourseScheduleStudentVo> practiceList = userList.stream().filter(s -> s.getType().equals(CourseScheduleEnum.PRACTICE.getCode())).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(practiceList)) {//添加陪练课评论
+                repliedDao.insertBatch(practiceList);
+            }
+
             //更新学生最近结课时间
             List<CourseScheduleStudentVo> pianoUserList = userList.stream().filter((CourseScheduleStudentVo s) -> s.getType().equals(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(pianoUserList)) {
@@ -1540,11 +1544,20 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             List<CourseScheduleRecord> recordList = recordDao.sumCourseTime();
             if (CollectionUtils.isNotEmpty(recordList)) {
                 //时长消费记录
-                recordDao.insertBatch(recordList);
+                String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
+                List<CourseScheduleRecord> records = recordList.stream()
+                        .map(s -> {
+                            Integer studentCount = s.getStudentCount();
+                            Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentCount + 1));
+                            s.setConsumTime(s.getSingleCourseTime() * n);
+                            return s;
+                        })
+                        .collect(Collectors.toList());
+                recordDao.insertBatch(records);
 
                 //释放冻结课时
                 List<PianoRoomTime> roomTimeList = new ArrayList<>();
-                Map<Long, List<CourseScheduleRecord>> collect = recordList.stream().collect(Collectors.groupingBy(CourseScheduleRecord::getTeacherId, Collectors.toList()));
+                Map<Long, List<CourseScheduleRecord>> collect = records.stream().collect(Collectors.groupingBy(CourseScheduleRecord::getTeacherId, Collectors.toList()));
                 collect.forEach((key, list) -> {
                     PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, key));
                     Integer frozenTime = pianoRoomTime.getFrozenTime();
@@ -1564,23 +1577,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //查完完成的课程
         List<CourseCompleteVo> completeList = baseMapper.selectComplete();
         if (CollectionUtils.isNotEmpty(completeList)) {
-            List<Long> gids = completeList.stream().map(CourseCompleteVo::getCourseGroupId).collect(Collectors.toList());
-            List<CourseGroup> courseGroups = courseGroupService.getDao().selectList(Wrappers.<CourseGroup>lambdaQuery().in(CourseGroup::getId, gids));
-            if (CollectionUtils.isNotEmpty(courseGroups)) {
-                List<Long> ids = new ArrayList<>();
-                for (CourseGroup group : courseGroups) {
-                    for (CourseCompleteVo complete : completeList) {
-                        Integer courseNum = group.getCourseNum();
-                        Integer completeCount = complete.getCourseCount();
-                        if (courseNum.equals(completeCount)) {
-                            ids.add(complete.getCourseGroupId());
-                        }
-                    }
-                }
-                if (CollectionUtils.isNotEmpty(ids)) {
-                    //同步课程组状态
-                    courseGroupService.getDao().updateBatch(ids);
-                }
+            List<Long> ids = completeList.stream().filter(s -> {
+                return s.getCourseCount().equals(s.getCourseNum());
+            }).map(s -> {
+                return s.getId();
+            }).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(ids)) {
+                //同步课程组状态
+                courseGroupService.getDao().updateBatch(ids);
             }
         }
     }
@@ -1649,7 +1653,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer classNum = arrangeCourseVo.getClassNum();//课时数
         Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
         List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
-        Integer consumTime = classNum * singleClssTime * studentIds.size();//消耗时长
+
+        String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
+        Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        Integer consumTime = classNum * singleClssTime * n;//消耗时长 课程数*单课时长*人数
+
         List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
         Integer consumeTime = arrangeCourseVo.getConsumeTime();
 
@@ -1865,7 +1873,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         //计算课时
         List<CourseScheduleStudentPayment> studentPaymentList = paymentDao.selectList(Wrappers.<CourseScheduleStudentPayment>lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId, courseId));
-        int time = studentPaymentList.size() * schedule.getSingleCourseTime();
+
+        String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
+        Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentPaymentList.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        Integer time = schedule.getSingleCourseTime() * n;//消耗时长 课程数*单课时长*人数
+
         PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
         if (pianoRoomTime == null) {
             throw new BizException("未查到剩余时长");
@@ -2009,9 +2021,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer frozenTime = pianoRoomTime.getFrozenTime();
         Integer remainTime = pianoRoomTime.getRemainTime();
 
+        String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
+
         int i = studentIds.size() - paymentList.size();//新人数-原人数
         if (i > 0) {//加人,扣时长
-            int courseTime = singleCourseTime * i;
+            Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(i + 1));
+            int courseTime = singleCourseTime * n;
             if (remainTime - courseTime < 0) {
                 throw new BizException("剩余时长不足");
             }
@@ -2021,7 +2036,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     .set(PianoRoomTime::getFrozenTime, frozenTime + courseTime));
         }
         if (i < 0) {//减人,释放时长
-            int courseTime = singleCourseTime * (-i);
+            Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(-i + 1));
+            int courseTime = singleCourseTime * n;
             pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
                     .eq(PianoRoomTime::getTeacherId, teacherId)
                     .set(PianoRoomTime::getRemainTime, remainTime + courseTime)
@@ -2035,8 +2051,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseTime.setStartTime(courseSchedule.getStartTime());
         courseTime.setEndTime(courseSchedule.getEndTime());
         List<CourseTimeEntity> timeList = Arrays.asList(courseTime);
-        //批量检查老师课时在数据库是否重复
-//        this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
 
         List<CourseScheduleStudentPayment> payments = new ArrayList<>();
         for (Long studentId : studentIds) {

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
 import org.slf4j.Logger;
@@ -36,8 +37,6 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
         List<MusicSheetPurchaseRecord> list = this.lambdaQuery()
                                                   .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                                                   .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                                                  .eq(MusicSheetPurchaseRecord::getOrderStatus,
-                                                      YesOrNoEnum.YES.getCode())
                                                   .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java

@@ -4,7 +4,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -268,4 +272,20 @@ public class WrapperUtil {
         return map;
     }
 
+    /**
+     * 字符串转公式
+     * @param formula 公式字符串
+     * @param variable 变量
+     * @param param 参数
+     * @return
+     */
+    public static Object strToFormula(String formula, String variable, String param){
+        ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
+        try {
+            return jse.eval(formula.replace(variable, param));
+        } catch (ScriptException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseCompleteVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -10,7 +11,7 @@ import java.io.Serializable;
  * @Date: 2022/5/30
  */
 @ApiModel
-public class CourseCompleteVo implements Serializable {
+public class CourseCompleteVo extends CourseGroup {
     @ApiModelProperty("课程组id")
     private Long courseGroupId;
     @ApiModelProperty("已完成课时数")

+ 80 - 56
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupPianoDetailVo.java

@@ -16,40 +16,96 @@ import java.util.Date;
 public class CourseGroupPianoDetailVo 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("学员人数")
+    private Integer studentCount;
+
+    @ApiModelProperty("扣减时长")
+    private Integer courseTime;
+
     @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;
+
+    @ApiModelProperty("学生状态 0:异常 1:正常")
+    private Integer studentSign;
+
+    @ApiModelProperty("老师状态 0:异常 1:正常")
+    private Integer teacherSign;
+
+    @ApiModelProperty("学生id")
+    private Long studentId;
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+    @ApiModelProperty("学生真实姓名")
+    private String studentRealName;
+
+    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 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 Long getCourseId() {
         return courseId;
@@ -91,36 +147,28 @@ public class CourseGroupPianoDetailVo extends BaseEntity {
         this.teacherRealName = teacherRealName;
     }
 
-    public Long getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Long studentId) {
-        this.studentId = studentId;
-    }
-
-    public String getStudentName() {
-        return studentName;
+    public String getStatus() {
+        return status;
     }
 
-    public void setStudentName(String studentName) {
-        this.studentName = studentName;
+    public void setStatus(String status) {
+        this.status = status;
     }
 
-    public String getStudentRealName() {
-        return studentRealName;
+    public Integer getStudentCount() {
+        return studentCount;
     }
 
-    public void setStudentRealName(String studentRealName) {
-        this.studentRealName = studentRealName;
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
     }
 
-    public String getStatus() {
-        return status;
+    public Integer getCourseTime() {
+        return courseTime;
     }
 
-    public void setStatus(String status) {
-        this.status = status;
+    public void setCourseTime(Integer courseTime) {
+        this.courseTime = courseTime;
     }
 
     public Date getStartTime() {
@@ -154,28 +202,4 @@ public class CourseGroupPianoDetailVo extends BaseEntity {
     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;
-    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleStudentVo.java

@@ -17,6 +17,9 @@ public class CourseScheduleStudentVo implements Serializable {
     @ApiModelProperty(value = "课程id")
     private Long courseId;
 
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
     @ApiModelProperty(value = "老师id")
     private Long teacherId;
 
@@ -32,6 +35,14 @@ public class CourseScheduleStudentVo implements Serializable {
     @ApiModelProperty(value = "课程类型")
     private String type;
 
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
     public String getType() {
         return type;
     }

+ 78 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentSignVo.java

@@ -0,0 +1,78 @@
+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/6/15
+ */
+@ApiModel
+public class StudentSignVo extends BaseEntity {
+    @ApiModelProperty("学生id")
+    private Long userId;
+
+    @ApiModelProperty("学生姓名")
+    private String userName;
+
+    @ApiModelProperty("学生真实姓名")
+    private String realName;
+
+    @ApiModelProperty("老师签到状态 0:异常 1:正常")
+    private Integer studentInSign;
+
+    @ApiModelProperty("老师签退状态 0:异常 1:正常")
+    private Integer studentOutSign;
+
+    @ApiModelProperty("课程id")
+    private Long courseId;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public 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;
+    }
+}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonAuthGroup.java

@@ -21,6 +21,17 @@ public class VideoLessonAuthGroup extends VideoLessonGroup {
     @ApiModelProperty(value = "课程名称")
     private String subjectName;
 
+    @ApiModelProperty("审核理由")
+    private String remarks;
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
     public String getRealName() {
         return realName;
     }

+ 249 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -89,6 +89,7 @@
                 and b.type_ = #{param.type}
             </if>
         </where>
+        order by b.created_time_
     </select>
 
     <select id="queryStudentCourseGroup" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupVo">
@@ -696,6 +697,253 @@
     </select>
     <select id="selectPianoGroupDetail"
             resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPianoDetailVo">
-
+        SELECT
+        cs.id_ AS courseId,
+        sb.id_ AS subjectId,
+        sb.name_ AS subjectName,
+        cs.teacher_id_ AS teacherId,
+        tu.username_ AS teacherName,
+        tu.real_name_ AS teacherRealName,
+        cs.status_ AS `status`,
+        a.studentCount AS studentCount,
+        (cs.single_course_time_ * (a.studentCount+1)*(a.studentCount+1-1)) AS courseTime,
+        cs.start_time_ AS startTime,
+        cs.end_time_ AS endTime,
+        b.teacherInSign AS teacherInSign,
+        b.teacherOutSign AS teacherOutSign
+        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 (SELECT course_id_,COUNT(1) AS studentCount FROM course_schedule_student_payment WHERE course_type_='PIANO_ROOM_CLASS' GROUP BY course_id_) a ON cs.id_=a.course_id_
+        LEFT JOIN (SELECT cs.id_ AS cid,( 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
+        FROM course_schedule cs LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_ WHERE cs.type_='PIANO_ROOM_CLASS') b ON cs.id_=b.cid
+        WHERE cs.type_='PIANO_ROOM_CLASS'
+        AND cs.course_group_id_=#{param.courseGroupId}
+        <if test="param.search != null and param.search != ''">
+            AND cs.id_ LIKE concat('%',#{param.search},'%')
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND cs.status_ = #{param.status}
+        </if>
+        <if test="param.startTime != null">
+            AND cs.start_time_ &lt;= #{param.startTime}
+        </if>
+        <if test="param.endTime != null">
+            AND cs.start_time_ &gt;= #{param.endTime}
+        </if>
+        <if test="param.teacherSign == 1">
+            AND b.teacherInSign = #{param.teacherSign}
+        </if>
+        <if test="param.teacherSign == 0">
+            AND b.teacherOutSign = #{param.teacherSign}
+        </if>
+        <if test="param.studentSign != null">
+            AND cs.id_ IN
+            <foreach collection="param.courseIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+    <select id="studentSign" resultType="com.yonge.cooleshow.biz.dal.vo.StudentSignVo">
+        SELECT
+        p.course_id_ AS courseId,
+        p.user_id_ AS userId,
+        u.username_ AS userName,
+        u.real_name_ AS realName,
+        ( CASE WHEN c.start_time_ &gt;= a.sign_in_time_ THEN 1 ELSE 0 END ) AS studentInSign,
+        ( CASE WHEN c.end_time_ &lt;= a.sign_out_time_ THEN 1 ELSE 0 END ) AS studentOutSign
+        FROM course_schedule_student_payment p
+        LEFT JOIN sys_user u ON p.user_id_=u.id_
+        LEFT JOIN course_schedule c ON p.course_id_=c.id_
+        LEFT JOIN student_attendance a ON p.user_id_=a.student_id_
+        <where>
+            <if test="courseId !=null">
+                AND p.course_id_=#{courseId}
+            </if>
+            <if test="type !=null and type!=''">
+                AND p.course_type_=#{type}
+            </if>
+        </where>
+    </select>
+    <select id="selectPianoGroupStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPianoVo">
+        SELECT DISTINCT
+            g.id_ AS courseGroupId,
+            g.name_ AS courseGroupName,
+            s.id_ AS subjectId,
+            s.name_ AS subjectName,
+            g.teacher_id_ AS teacherId,
+            u.username_ AS teacherName,
+            u.real_name_ AS teacherRealName,
+            g.course_num_ AS courseNum,
+            IFNULL(cm.count_,0) AS completeCount,
+            g.status_ AS `status`,
+            st.start_time_ AS startTime
+        FROM course_schedule_student_payment p
+        LEFT JOIN course_group g ON p.course_group_id_=g.id_
+        LEFT JOIN `subject` s ON g.subject_id_=s.id_
+        LEFT JOIN sys_user u ON g.teacher_id_=u.id_
+        LEFT JOIN (SELECT course_group_id_,COUNT(1) AS count_ FROM course_schedule WHERE type_='PIANO_ROOM_CLASS' AND status_='COMPLETE' GROUP BY course_group_id_) cm ON p.course_group_id_=cm.course_group_id_
+        LEFT JOIN (SELECT course_group_id_,start_time_ FROM course_schedule WHERE type_='PIANO_ROOM_CLASS' GROUP BY course_group_id_) st ON p.course_group_id_=st.course_group_id_
+        WHERE p.course_type_='PIANO_ROOM_CLASS'
+        AND p.user_id_=#{param.studentId}
+        <if test="param.search != null and param.search != ''">
+            AND (
+            g.id_ LIKE concat('%',#{param.search},'%') OR
+            g.name_ LIKE concat('%',#{param.search},'%')
+            )
+        </if>
+        <if test="param.subjectId != null">
+            AND s.id_ = #{param.subjectId}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND g.status_ = #{param.status}
+        </if>
+    </select>
+    <select id="selectPianoGroupStudentDetail"
+            resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPianoDetailVo">
+        SELECT * FROM (
+        SELECT
+        cs.id_ AS courseId,
+        sb.id_ AS subjectId,
+        sb.name_ AS subjectName,
+        cs.teacher_id_ AS teacherId,
+        tu.username_ AS teacherName,
+        tu.real_name_ AS teacherRealName,
+        cs.status_ AS `status`,
+        a.studentCount AS studentCount,
+        (cs.single_course_time_ * (a.studentCount+1)*(a.studentCount+1-1)) AS courseTime,
+        cs.start_time_ AS startTime,
+        cs.end_time_ AS endTime,
+        p.user_id_ AS studentId,
+        (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_ AND cs.end_time_ &lt;= sa.sign_out_time_ THEN 1 ELSE 0 END) AS studentSign,
+        (CASE WHEN cs.start_time_ &gt;= ta.sign_in_time_ AND cs.end_time_ &lt;= ta.sign_out_time_ THEN 1 ELSE 0 END) AS teacherSign
+        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 (SELECT course_id_,COUNT(1) AS studentCount FROM course_schedule_student_payment WHERE course_type_='PIANO_ROOM_CLASS' GROUP BY course_id_) a ON cs.id_=a.course_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_student_payment p ON cs.id_=p.course_id_
+        WHERE cs.type_='PIANO_ROOM_CLASS'
+        AND p.user_id_=#{param.studentId}
+        AND p.course_group_id_=#{param.courseGroupId}) m
+        <where>
+        <if test="param.search != null and param.search != ''">
+            AND courseId LIKE concat('%',#{param.search},'%')
+        </if>
+        <if test="param.studentSign != null">
+            AND studentSign = #{param.studentSign}
+        </if>
+        <if test="param.teacherSign != null">
+            AND teacherSign = #{param.teacherSign}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND `status` = #{param.status}
+        </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="selectPianoGroupTeacher" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPianoVo">
+        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.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_='PIANO_ROOM_CLASS' 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_='PIANO_ROOM_CLASS' GROUP BY course_group_id_) st ON cg.id_=st.course_group_id_
+        WHERE cg.type_='PIANO_ROOM_CLASS'
+        AND cg.teacher_id_=#{param.teacherId}
+        <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>
+    <select id="selectPianoGroupTeacherDetail"
+            resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupPianoDetailVo">
+        SELECT * FROM (
+        SELECT
+        cs.id_ AS courseId,
+        sb.id_ AS subjectId,
+        sb.name_ AS subjectName,
+        cs.teacher_id_ AS teacherId,
+        tu.username_ AS teacherName,
+        tu.real_name_ AS teacherRealName,
+        cs.status_ AS `status`,
+        a.studentCount AS studentCount,
+        (cs.single_course_time_ * (a.studentCount+1)*(a.studentCount+1-1)) AS courseTime,
+        cs.start_time_ AS startTime,
+        cs.end_time_ AS endTime,
+        p.user_id_ AS studentId,
+        su.username_ AS studentName,
+        su.real_name_ AS studentRealName,
+        (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_ AND cs.end_time_ &lt;= sa.sign_out_time_ THEN 1 ELSE 0 END) AS studentSign,
+        (CASE WHEN cs.start_time_ &gt;= ta.sign_in_time_ AND cs.end_time_ &lt;= ta.sign_out_time_ THEN 1 ELSE 0 END) AS teacherSign
+        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 (SELECT course_id_,COUNT(1) AS studentCount FROM course_schedule_student_payment WHERE course_type_='PIANO_ROOM_CLASS' GROUP BY course_id_) a ON cs.id_=a.course_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_student_payment p ON cs.id_=p.course_id_
+        LEFT JOIN sys_user su ON cs.teacher_id_ = su.id_
+        WHERE cs.type_='PIANO_ROOM_CLASS'
+        AND cs.teacher_id_=#{param.teacherId}
+        AND p.course_group_id_=#{param.courseGroupId}) m
+        <where>
+            <if test="param.search != null and param.search != ''">
+                AND (
+                courseId LIKE concat('%',#{param.search},'%') OR
+                studentName LIKE concat('%',#{param.search},'%') OR
+                studentId LIKE concat('%',#{param.search},'%')
+                )
+            </if>
+            <if test="param.studentSign != null">
+                AND studentSign = #{param.studentSign}
+            </if>
+            <if test="param.teacherSign != null">
+                AND teacherSign = #{param.teacherSign}
+            </if>
+            <if test="param.status != null and param.status != ''">
+                AND `status` = #{param.status}
+            </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>
 </mapper>

+ 4 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -149,7 +149,10 @@
                 and #{param.endTime} &gt; ch.create_time_
             </if>
         </where>
-        order by cs.start_time_ desc
+        order by cs.start_time_
+        <if test="param.date == null or param.date == ''">
+            desc
+        </if>
 	</select>
 
 	<select id="selectCourseHomeworkDetailByCourseId"

+ 8 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -209,7 +209,7 @@
         <if test="param.endDate !=null and param.endDate !=''">
             <![CDATA[ AND cs.class_date_  <= #{param.endDate} ]]>
         </if>
-        <if test="param.repliedIds !=null">
+        <if test="param.repliedIds !=null and param.repliedIds.size > 0">
             AND p.user_id_ IN
             <foreach collection="param.repliedIds" item="repliedIds" open="(" close=")" separator=",">
                 #{repliedIds}
@@ -301,6 +301,7 @@
         <if test="param.endDate !=null and param.endDate !=''">
             <![CDATA[ AND s.class_date_  <= #{param.endDate} ]]>
         </if>
+        ORDER BY s.start_time_
     </select>
 
     <select id="queryCourseUser" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudent">
@@ -802,7 +803,12 @@
         SELECT id_ FROM course_schedule WHERE lock_=0 AND class_date_ &lt;= #{day}
     </select>
     <select id="selectComplete" resultType="com.yonge.cooleshow.biz.dal.vo.CourseCompleteVo">
-        SELECT course_group_id_ AS courseGroupId ,COUNT(1) AS courseCount  FROM course_schedule WHERE lock_=0 AND status_='COMPLETE' GROUP BY course_group_id_
+        SELECT *
+        FROM (
+            SELECT course_group_id_ AS courseGroupId ,COUNT(1) AS courseCount
+            FROM course_schedule
+            WHERE lock_=0 AND status_='COMPLETE' GROUP BY course_group_id_) a
+        LEFT JOIN course_group g ON g.id_=a.courseGroupId
     </select>
     <update id="updateStartTime">
         UPDATE course_schedule SET status_='ING' WHERE id_ IN(

+ 13 - 19
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRecordMapper.xml

@@ -3,25 +3,18 @@
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.CourseScheduleRecordDao">
     <select id="sumCourseTime" resultType="com.yonge.cooleshow.biz.dal.entity.CourseScheduleRecord">
         SELECT
-            teacherId,
-            courseId,
-            SUM( singleCourseTime ) AS consumTime,
-            COUNT( studentId ) AS studentCount,
-            endTime
-        FROM
-            (SELECT
-                 c.id_ AS courseId,
-                 c.teacher_id_ AS teacherId,
-                 p.user_id_ AS studentId,
-                 c.end_time_ AS endTime,
-                 c.single_course_time_ AS singleCourseTime
-             FROM course_schedule c
-             LEFT JOIN course_schedule_student_payment p ON c.id_ = p.course_id_
-             WHERE c.type_ = 'PIANO_ROOM_CLASS'
-             AND c.lock_ = 0
-             AND c.status_ IN ( 'ING', 'NOT_START' )
-             AND NOW() >= c.end_time_) a
-        GROUP BY courseId
+            c.id_ AS courseId,
+            c.teacher_id_ AS teacherId,
+            COUNT(1) AS studentCount,
+            c.end_time_ AS endTime,
+            c.single_course_time_ AS singleCourseTime
+        FROM course_schedule c
+        LEFT JOIN course_schedule_student_payment p ON c.id_ = p.course_id_
+        WHERE c.type_ = 'PIANO_ROOM_CLASS'
+        AND c.lock_ = 0
+        AND c.status_ IN ( 'ING', 'NOT_START' )
+        AND NOW() >= c.end_time_
+        GROUP BY c.id_
     </select>
     <select id="countTimeByTeacherId" resultType="java.lang.Long">
         SELECT SUM(consum_time_) FROM course_schedule_piano WHERE teacher_id_=#{teacherId} AND  date_format(end_time_,'%Y-%m') = #{month}
@@ -106,5 +99,6 @@
                 AND s.status_ = #{param.status}
             </if>
         </where>
+        ORDER BY s.start_time_
     </select>
 </mapper>

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

@@ -76,6 +76,12 @@
             </if>
         </trim>
     </insert>
+    <insert id="insertBatch">
+        INSERT INTO course_schedule_replied (student_id_,course_schedule_id_,course_group_type_,course_group_id_) VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.studentId},#{item.courseId},#{item.type},#{item.courseGroupId})
+        </foreach>
+    </insert>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.CourseScheduleRepliedVo">
         SELECT
@@ -92,6 +98,9 @@
     <select id="selectAll" resultType="java.lang.Long">
         SELECT student_id_ FROM course_schedule_replied WHERE course_group_type_='PRACTICE'
     </select>
+    <select id="selectReplyStudent" resultType="java.lang.Long">
+        SELECT student_id_ FROM course_schedule_replied WHERE course_group_type_='PRACTICE' AND teacher_replied_ != ''
+    </select>
     <update id="updateReplied" parameterType="com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied">
         UPDATE course_schedule_replied
         <set>
@@ -128,6 +137,7 @@
         LEFT JOIN course_schedule s ON s.id_ = r.course_schedule_id_
         LEFT JOIN sys_user u ON u.id_ = r.student_id_
         WHERE r.course_group_type_ = 'PRACTICE'
+        AND r.student_replied_ != ""
         AND s.teacher_id_ = #{param.teacherId}
         <if test="param.studentName !=null and param.studentName !=''">
             AND u.username_ LIKE CONCAT('%', #{param.studentName}, '%')
@@ -135,6 +145,7 @@
         <if test="param.classDate !=null and param.classDate !=''">
             AND DATE_FORMAT(s.class_date_,'%Y-%m') = #{param.classDate}
         </if>
+        ORDER BY s.start_time_
     </select>
     <select id="selectReplied" resultType="com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo"
             parameterType="com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied">
@@ -159,6 +170,7 @@
         WHERE t.course_schedule_id_=#{courseScheduleId}
         AND t.course_group_id_=#{courseGroupId}
         AND t.course_group_type_=#{courseGroupType}
+        ORDER BY s.start_time_
     </select>
     <select id="selectAllClass" resultType="java.lang.Long">
         SELECT course_schedule_id_ FROM course_schedule_replied WHERE course_group_type_='PRACTICE'

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

@@ -150,6 +150,7 @@
     <select id="selectUser" resultType="com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentVo">
         SELECT
             c.id_ AS courseId,
+            c.course_group_id_ AS courseGroupId,
             c.teacher_id_ AS teacherId,
             p.user_id_ AS studentId,
             c.end_time_ AS endTime,

+ 7 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -280,9 +280,11 @@
         where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
         ,(select group_concat(s.name_) from subject s
         where find_in_set(s.id_,t.music_subject_) and s.del_flag_ = 0 ) as subjectNames
+        ,if(mf.id_ is not null,1,0) as favorite
         from music_sheet t
         left join sys_user su on t.create_by_ = su.id_
         left join music_sheet_purchase_record mspr on mspr.music_sheet_id_ = t.id_
+        left join music_favorite mf on t.id_ = mf.music_sheet_id_ and mspr.student_id_ = mf.user_id_
         <where>
             <include refid="QueryInfo"/>
             <if test="param.studentId != null">
@@ -321,19 +323,22 @@
         ,(select group_concat(mt.name_) from music_tag mt
         where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
         ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
+        ,if(mf.id_ is not null,1,0) as favorite
         from music_sheet t
         left join sys_user su on t.create_by_ = su.id_
+        left join music_sheet_practice_record mspr on mspr.music_sheet_id_ = t.id_
+        left join music_favorite mf on t.id_ = mf.music_sheet_id_ and mspr.user_id_ = mf.user_id_
         <where>
             <include refid="QueryInfo"/>
             <if test="practiceMusicIdList != null and practiceMusicIdList.size() != 0">
-                and t.id_ in
+                and mspr.id_ in
                 <foreach collection="practiceMusicIdList" item="item" open="(" close=")" separator=",">
                     #{item}
                 </foreach>
             </if>
         </where>
         <if test="practiceMusicIdList != null and practiceMusicIdList.size() != 0">
-            order by field(t.id_,
+            order by field(mspr.id_,
             <foreach collection="practiceMusicIdList" item="item" separator=",">
                 #{item}
             </foreach>

+ 4 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPracticeRecordMapper.xml

@@ -17,7 +17,8 @@
         </sql>
 
 	<select id="selectPracticeMusicIdPage" resultType="java.lang.Long">
-        select t.music_sheet_id_ from  (select mspr.music_sheet_id_
+        select t.id_ from  (select
+        max(mspr.id_) as id_
         from music_sheet_practice_record mspr
         left join music_sheet ms on mspr.music_sheet_id_ = ms.id_
         <where>
@@ -31,6 +32,7 @@
                 and mspr.user_id_ = #{param.studentId}
             </if>
         </where>
-        order by mspr.create_time_) t group by t.music_sheet_id_
+        group by mspr.music_sheet_id_
+        ) t  order by t.id_ desc
     </select>
 </mapper>

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

@@ -268,6 +268,7 @@
 		SELECT
 		<include refid="recordColumns"/>
 		r.audit_status_ AS auditStatus,
+		r.remarks as remarks,
 		s.name_ AS subjectName,
 		t.username_ AS teacherName,
 		t.real_name_ AS realName,

+ 1 - 1
cooleshow-user/user-student/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mdata/logs/cms-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="/mdata/logs/student-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 2 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -162,7 +162,8 @@ public class TeacherCourseScheduleController extends BaseController {
 //        courseScheduleService.scheduleTask();
 //        return succeed(courseScheduleService.getTeacherId(amount));
 //        courseScheduleService.scheduleTask();
-        courseScheduleService.teacherSalaryTask();
+//        courseScheduleService.teacherSalaryTask();
+        courseScheduleService.scheduleTask();
         return succeed();
     }
 

+ 1 - 1
cooleshow-user/user-teacher/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mdata/logs/cms-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="/mdata/logs/teacher-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 1 - 7
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenVideoGroupController.java

@@ -34,7 +34,7 @@ import javax.validation.constraints.NotNull;
  **/
 @RestController
 @RequestMapping("/open/videoLessonGroup")
-@Api(tags = "视频课组")
+@Api(tags = "开放视频课接口")
 public class OpenVideoGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
@@ -50,12 +50,6 @@ public class OpenVideoGroupController extends BaseController {
     @ApiOperation(value = "查询视频课组")
     @PostMapping(value = "/page")
     public HttpResponseResult<PageInfo<VideoLessonGroupVo>> page(@RequestBody VideoLessonGroupSearch query) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-
-        query.setTeacherId(sysUser.getId());
         IPage<VideoLessonGroupVo> pages = videoLessonGroupService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }

+ 33 - 0
toolset/toolset-mybatis/src/main/java/com/yonge/toolset/mybatis/config/MyBatisPlusConfig.java

@@ -0,0 +1,33 @@
+package com.yonge.toolset.mybatis.config;
+
+import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+/**
+ * @author hgw
+ * Created by 2021-12-02
+ */
+@Configuration
+public class MyBatisPlusConfig {
+
+    @Autowired
+    private MybatisPlusProperties plusProperties;
+
+    /**
+     * 分页插件
+     */
+    @Bean
+    @Primary
+    public PaginationInterceptor paginationInterceptor() {
+        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
+        mybatisConfiguration.setMapUnderscoreToCamelCase(true);
+        mybatisConfiguration.setCacheEnabled(false);
+        plusProperties.setConfiguration(mybatisConfiguration);
+        return new PaginationInterceptor();
+    }
+}