ソースを参照

Merge remote-tracking branch 'origin/master'

liweifan 3 年 前
コミット
926bd0c7fa
44 ファイル変更924 行追加295 行削除
  1. 2 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java
  2. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderSender.java
  3. 2 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/HomeController.java
  4. 0 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java
  5. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  6. 0 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java
  7. 1 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PortalBrandController.java
  8. 0 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java
  9. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/CartProduct.java
  10. 0 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ProductSearch.java
  11. 0 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderReturnApplyService.java
  12. 4 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  13. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java
  14. 28 34
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  15. 2 12
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPromotionServiceImpl.java
  16. 4 6
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  17. 3 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  18. 12 5
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseHomeworkController.java
  19. 32 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseHomeworkDao.java
  20. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  21. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkReviewDto.java
  22. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseScheduleHomeworkSearch.java
  23. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java
  24. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java
  25. 0 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomResult.java
  26. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/HomeworkAdminSearch.java
  27. 5 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/HomeworkSearch.java
  28. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMember.java
  29. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseHomeworkService.java
  30. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  31. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java
  32. 122 51
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  33. 10 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  34. 7 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  35. 60 31
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  36. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java
  37. 207 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleHomeworkVo.java
  38. 59 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeworkVo.java
  39. 87 44
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  40. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  41. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  42. 36 41
      cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.java
  43. 7 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java
  44. 29 6
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

+ 2 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java

@@ -15,12 +15,12 @@ import org.springframework.stereotype.Component;
 @Component
 @RabbitListener(queues = "mall.order.cancel")
 public class CancelOrderReceiver {
-    private static Logger LOGGER =LoggerFactory.getLogger(CancelOrderReceiver.class);
+    private static Logger logger =LoggerFactory.getLogger(CancelOrderReceiver.class);
     @Autowired
     private OmsPortalOrderService portalOrderService;
     @RabbitHandler
     public void handle(Long orderId){
         portalOrderService.cancelOrder(orderId, "超时取消", null);
-        LOGGER.info("process orderId:{}",orderId);
+        logger.info("process orderId:{}", orderId);
     }
 }

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderSender.java

@@ -16,7 +16,7 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class CancelOrderSender {
-    private static Logger LOGGER =LoggerFactory.getLogger(CancelOrderSender.class);
+    private static final Logger LOGGER =LoggerFactory.getLogger(CancelOrderSender.class);
     @Autowired
     private AmqpTemplate amqpTemplate;
 

+ 2 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/HomeController.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.portal.controller;
 
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.CmsSubject;
 import com.yonge.cooleshow.mbg.model.PmsProduct;
@@ -27,7 +26,7 @@ public class HomeController {
     private HomeService homeService;
 
     @ApiOperation("首页内容信息展示")
-    @RequestMapping(value = "/content", method = RequestMethod.GET)
+    @GetMapping(value = "/content")
     @ResponseBody
     public CommonResult<HomeContentResult> content() {
         HomeContentResult contentResult = homeService.content();
@@ -62,7 +61,7 @@ public class HomeController {
     }
 
     @ApiOperation("分页获取热销推荐商品")
-    @RequestMapping(value = "/hotProductList", method = RequestMethod.GET)
+    @GetMapping(value = "/hotProductList")
     @ResponseBody
     public CommonResult<List<PmsProduct>> hotProductList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                                          @RequestParam(value = "pageSize", defaultValue = "6") Integer pageSize) {

+ 0 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java

@@ -2,7 +2,6 @@ package com.yonge.cooleshow.portal.controller;
 
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
-import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.mbg.model.OmsOrderReturnReason;
 import com.yonge.cooleshow.portal.domain.OmsOrderReturnApplyParam;
 import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;

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

@@ -101,7 +101,7 @@ public class PaymentController extends BaseController {
 
     @ApiOperation(value = "查询付款单")
     @GetMapping("/queryPayment")
-    public HttpResponseResult<Payment> queryPayment(String paymentNo) throws Exception {
+    public HttpResponseResult<Payment> queryPayment(String paymentNo) {
         UserOrderPayment userOrderPayment = userOrderPaymentService.getByTranNo(paymentNo);
         if (null == userOrderPayment) {
             return HttpResponseResult.succeed();

+ 0 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java

@@ -8,7 +8,6 @@ import com.yonge.cooleshow.portal.dto.ProductSearch;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;

+ 1 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PortalBrandController.java

@@ -8,7 +8,6 @@ import com.yonge.cooleshow.portal.service.PortalBrandService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -18,7 +17,7 @@ import java.util.List;
  * Created by macro on 2020/5/15.
  */
 // @Controller
-@Api(tags = "PortalBrandController", description = "前台品牌管理")
+@Api(tags = "PortalBrandController 前台品牌管理")
 @RequestMapping("/brand")
 public class PortalBrandController {
 

+ 0 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.portal.dao;
 
-import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
 import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyVo;
 import com.yonge.cooleshow.portal.dto.OmsReturnApplyQueryParam;

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/CartProduct.java

@@ -26,10 +26,12 @@ public class CartProduct extends PmsProduct {
         this.productAttributeList = productAttributeList;
     }
 
+    @Override
     public List<PmsSkuStock> getSkuStockList() {
         return skuStockList;
     }
 
+    @Override
     public void setSkuStockList(List<PmsSkuStock> skuStockList) {
         this.skuStockList = skuStockList;
     }

+ 0 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ProductSearch.java

@@ -1,7 +1,6 @@
 package com.yonge.cooleshow.portal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
-import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * Description

+ 0 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderReturnApplyService.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.portal.service;
 
-import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.portal.domain.OmsOrderReturnApplyParam;
 import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
 import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyVo;

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

@@ -8,8 +8,9 @@ import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.CartPromotionItem;
-import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
-import com.yonge.cooleshow.portal.service.*;
+import com.yonge.cooleshow.portal.service.OmsCartItemService;
+import com.yonge.cooleshow.portal.service.OmsPromotionService;
+import com.yonge.cooleshow.portal.service.UmsMemberService;
 import com.yonge.toolset.base.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -110,7 +111,7 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
 
     @Override
     public List<CartPromotionItem> listPromotion(Long memberId, List<Long> cartIds, boolean del) {
-        List<OmsCartItem> cartItemList = new ArrayList<>();
+        List<OmsCartItem> cartItemList;
         if (!del) {
             cartItemList = list(memberId);
             if (CollUtil.isNotEmpty(cartIds)) {

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

@@ -39,7 +39,7 @@ import java.util.List;
 @Service
 public class OmsPortalOrderReturnApplyServiceImpl implements OmsPortalOrderReturnApplyService {
 
-    private static final Logger log = LoggerFactory.getLogger(OmsPortalOrderReturnApplyService.class);
+    private static final Logger log = LoggerFactory.getLogger(OmsPortalOrderReturnApplyServiceImpl.class);
 
     @Autowired
     private OmsOrderReturnApplyMapper returnApplyMapper;

+ 28 - 34
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -3,14 +3,7 @@ package com.yonge.cooleshow.portal.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.portal.dao.PortalProductDao;
-import com.yonge.cooleshow.portal.dto.OrderPayReq;
-import com.yonge.cooleshow.portal.dto.OrderPayRes;
-import com.yonge.toolset.base.exception.BizException;
-
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mall.common.service.RedisService;
@@ -19,15 +12,16 @@ import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.component.CancelOrderSender;
 import com.yonge.cooleshow.portal.dao.PortalOrderDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
-import com.yonge.cooleshow.portal.dao.SmsCouponHistoryDao;
+import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.*;
+import com.yonge.cooleshow.portal.dto.OrderPayReq;
+import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.cooleshow.portal.service.*;
-import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
-import com.yonge.toolset.utils.string.StringUtil;
-
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.DeviceInfo;
 import com.yonge.toolset.payment.base.model.DivMember;
@@ -36,7 +30,7 @@ import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
-
+import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,7 +51,7 @@ import java.util.stream.Collectors;
 @Service
 public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
-    private static final Logger log = LoggerFactory.getLogger(OmsPortalOrderService.class);
+    private static final Logger LOG = LoggerFactory.getLogger(OmsPortalOrderServiceImpl.class);
     @Autowired
     private UmsMemberService memberService;
     @Autowired
@@ -70,8 +64,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private UmsIntegrationConsumeSettingMapper integrationConsumeSettingMapper;
     @Autowired
     private PmsSkuStockMapper skuStockMapper;
-    @Autowired
-    private SmsCouponHistoryDao couponHistoryDao;
+
     @Autowired
     private OmsOrderMapper orderMapper;
     @Autowired
@@ -394,7 +387,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     public void sendDelayMessageCancelOrder(Long orderId) {
         //获取订单超时时间
         OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
-        long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000;
+        long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000L;
         //发送延迟消息
         cancelOrderSender.sendMessage(orderId, delayTimes);
     }
@@ -661,14 +654,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         //订单完成
         UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
         if (null == userOrderPayment) {
-            log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
+            String string = JSON.toJSONString(data);
+            LOG.error("汇付支付回调,订单未找到。 req is {}", string);
             return;
         }
         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
         if (detail.getStatus() == 0) {
             orderSuccess(detail, data,data.getId());
         } else {
-            log.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
+            LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
         }
     }
 
@@ -681,21 +675,22 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private void paymentFailedHandle(PaymentCallBack data) {
         //订单完成
         UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
+        String dataString = JSON.toJSONString(data);
         if (null == userOrderPayment) {
-            log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
+            LOG.error("汇付支付回调,订单未找到。 req is {}", dataString);
             return;
         }
 
         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
         if (null == detail) {
-            log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
+            LOG.error("汇付支付回调,订单未找到。 req is {}", dataString);
             return;
         }
         if (detail.getStatus() == 0) {
 
             cancelOrder(detail.getId(), data.getErrMsg(),data);
         } else {
-            log.error("汇付支付回调,订单状态异常。 req is {}", JSON.toJSONString(data));
+            LOG.error("汇付支付回调,订单状态异常。 req is {}", dataString);
         }
     }
 
@@ -739,12 +734,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     /***
      * 处理支付中订单
      */
-    @Transactional(rollbackFor = Exception.class)
     void payingOrderHandle(OmsOrder userOrder) {
         //判断汇付订单状态
         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(userOrder.getOrderSn());
         if (null == orderPayment) {
             cancelOrder(userOrder.getId(), "支付超时", null);
+            return;
         }
         OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         try {
@@ -754,7 +749,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             param.setPaymentNo(orderPayment.getAdapayNo());
             BaseResult<Payment> res = paymentClient.queryPayment(param);
             //支付成功
-            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())
+            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
                     && (detail.getStatus() == 0 || detail.getStatus() == 1)
             ) {
                 orderSuccess(detail,res.getData().getId());
@@ -768,7 +763,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             cancelOrder(userOrder.getId(), "支付超时", null);
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("轮询处理支付中订单异常,异常参数: {}", JSONObject.toJSONString(userOrder));
+            LOG.error("轮询处理支付中订单异常,异常参数: {}", JSON.toJSONString(userOrder));
         }
     }
 
@@ -784,12 +779,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      * @updateTime 2022/4/13 17:17
      */
     @Transactional(rollbackFor = Exception.class)
-    void orderSuccess(OmsOrder detail, PaymentCallBack data, String tranId) {
+    public void orderSuccess(OmsOrder detail, PaymentCallBack data, String tranId) {
         //更新订单
         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
 
         if (orderPayment == null) {
-            log.error("支付回调,支付中订单未找到。 orderNo is {}",detail.getOrderSn());
+            LOG.error("支付回调,支付中订单未找到。 orderNo is {}", detail.getOrderSn());
             return;
         }
         if (data != null) {
@@ -815,7 +810,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 orderPayment.setFeeAmt(new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
             } catch (Exception e) {
                 e.printStackTrace();
-                log.error("完成订单,付款单金额格式化失败,参数{}", JSON.toJSONString(data));
+                LOG.error("完成订单,付款单金额格式化失败,参数{}", JSON.toJSONString(data));
             }
         }
         userOrderPaymentService.saveOrUpdate(orderPayment);
@@ -857,7 +852,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      * 计算该订单赠送的成长值
      */
     private Integer calcGiftGrowth(List<OmsOrderItem> orderItemList) {
-        Integer sum = 0;
+        int sum = 0;
         for (OmsOrderItem orderItem : orderItemList) {
             sum = sum + orderItem.getGiftGrowth() * orderItem.getProductQuantity();
         }
@@ -929,12 +924,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      */
     private BigDecimal calcPayAmount(OmsOrder order) {
         //总金额+运费-促销优惠-优惠券优惠-积分抵扣
-        BigDecimal payAmount = order.getTotalAmount()
-                .add(order.getFreightAmount())
-                .subtract(order.getPromotionAmount())
-                .subtract(order.getCouponAmount())
-                .subtract(order.getIntegrationAmount());
-        return payAmount;
+        return order.getTotalAmount()
+                    .add(order.getFreightAmount())
+                    .subtract(order.getPromotionAmount())
+                    .subtract(order.getCouponAmount())
+                    .subtract(order.getIntegrationAmount());
     }
 
     /**

+ 2 - 12
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPromotionServiceImpl.java

@@ -194,12 +194,7 @@ public class OmsPromotionServiceImpl implements OmsPromotionService {
 
     private PmsProductFullReduction getProductFullReduction(BigDecimal totalAmount,List<PmsProductFullReduction> fullReductionList) {
         //按条件从高到低排序
-        fullReductionList.sort(new Comparator<PmsProductFullReduction>() {
-            @Override
-            public int compare(PmsProductFullReduction o1, PmsProductFullReduction o2) {
-                return o2.getFullPrice().subtract(o1.getFullPrice()).intValue();
-            }
-        });
+        fullReductionList.sort((o1, o2) -> o2.getFullPrice().subtract(o1.getFullPrice()).intValue());
         for(PmsProductFullReduction fullReduction:fullReductionList){
             if(totalAmount.subtract(fullReduction.getFullPrice()).intValue()>=0){
                 return fullReduction;
@@ -228,12 +223,7 @@ public class OmsPromotionServiceImpl implements OmsPromotionService {
      */
     private PmsProductLadder getProductLadder(int count, List<PmsProductLadder> productLadderList) {
         //按数量从大到小排序
-        productLadderList.sort(new Comparator<PmsProductLadder>() {
-            @Override
-            public int compare(PmsProductLadder o1, PmsProductLadder o2) {
-                return o2.getCount() - o1.getCount();
-            }
-        });
+        productLadderList.sort((o1, o2) -> o2.getCount() - o1.getCount());
         for (PmsProductLadder productLadder : productLadderList) {
             if (count >= productLadder.getCount()) {
                 return productLadder;

+ 4 - 6
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -99,10 +99,9 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
     public List<PmsProductCategoryNode> categoryTreeList() {
         PmsProductCategoryExample example = new PmsProductCategoryExample();
         List<PmsProductCategory> allList = productCategoryMapper.selectByExample(example);
-        List<PmsProductCategoryNode> result = allList.stream()
-                .filter(item -> item.getParentId().equals(0L))
-                .map(item -> covert(item, allList)).collect(Collectors.toList());
-        return result;
+        return allList.stream()
+                      .filter(item -> item.getParentId().equals(0L))
+                      .map(item -> covert(item, allList)).collect(Collectors.toList());
     }
 
     @Override
@@ -198,8 +197,7 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         PmsBrandExample pmsBrandExample = new PmsBrandExample();
         pmsBrandExample.createCriteria().andShowStatusEqualTo(1);
         pmsBrandExample.setOrderByClause("sort desc");
-        List<PmsBrand> pmsBrands = brandMapper.selectByExample(pmsBrandExample);
-        return pmsBrands;
+        return brandMapper.selectByExample(pmsBrandExample);
     }
 
 

+ 3 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -72,7 +72,9 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
             orderPayment.setStatus(TradeStatusEnum.failed.getCode());
             orderPayment.setPayFailMsg(StringUtil.isEmpty(message) ? "交易取消" : message);
             orderPayment.setUpdateTime(new Date());
-            orderPayment.setTransNo(data.getId());
+            if(data != null) {
+                orderPayment.setTransNo(data.getId());
+            }
 
             //发送支付关单请求
             if (!StringUtil.isEmpty(orderPayment.getTransNo())) {

+ 12 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseHomeworkController.java

@@ -19,6 +19,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 @RestController
 @RequestMapping("/homework")
@@ -37,17 +39,22 @@ public class CourseHomeworkController extends BaseController {
 	public HttpResponseResult<PageInfo<CourseHomeworkVo>> list(@Valid @RequestBody HomeworkAdminSearch query) {
 		query.setDecorate(YesOrNoEnum.YES);
 		query.setCourseStatus(CourseScheduleEnum.COMPLETE);
-		query.setCourseType(CourseScheduleEnum.PRACTICE);
+
+		List<CourseScheduleEnum> list = new ArrayList<>();
+		list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+		list.add(CourseScheduleEnum.PRACTICE);
+		query.setCourseType(list);
 		return succeed(PageUtil.pageInfo(courseHomeworkService.selectAdminPage(PageUtil.getPage(query),query)));
 	}
 
 
-	@ApiOperation(value = "首页-我的课程-课程详情(陪练课)-课后作业信息详情",notes = "传入课程编号ID")
-	@GetMapping(value = "/detail/{courseId}")
+	@ApiOperation(value = "课后作业-详情",notes = "传入课程编号ID")
+	@GetMapping(value = "/detail/{courseId}/{studentId}")
 	@PreAuthorize("@pcs.hasPermissions('homework/detail')")
 	public HttpResponseResult<CourseHomeworkDetailVo> detail(@ApiParam(value = "课程编号ID", required = true)
-															 @PathVariable("courseId") Long courseId) {
-		return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId));
+															 @PathVariable("courseId") Long courseId,
+															 @PathVariable("studentId") Long studentId) {
+		return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId,studentId));
 	}
 
 

+ 32 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseHomeworkDao.java

@@ -7,6 +7,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentHomeworkVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -34,19 +36,21 @@ public interface CourseHomeworkDao extends BaseMapper<CourseHomework> {
 	/**
 	 * 课程详情 课后作业信息
 	 *
-	 * @param courseId 课程id
+	 * @param courseId  课程id
+	 * @param studentId
 	 * @return 课后作业信息
 	 */
-	CourseHomeworkDetailVo selectCourseHomeworkDetailByCourseId(@Param("courseId") Long courseId);
+	CourseHomeworkDetailVo selectCourseHomeworkDetailByCourseId(@Param("courseId") Long courseId, @Param("studentId") Long studentId);
 
 	/**
 	 * 获取课程购买的用户信息
 	 *
 	 * @param courseGroupId    课程组id
 	 * @param courseScheduleId 课程id
+	 * @param studentId
 	 * @return 购买用户信息
 	 */
-	CourseHomeworkDetailVo selectPaymentStudentInfo(@Param("courseScheduleId") Long courseScheduleId);
+	CourseHomeworkDetailVo selectPaymentStudentInfo(@Param("courseScheduleId") Long courseScheduleId, @Param("studentId") Long studentId);
 
 	/**
 	 * 获取课程购买的用户信息
@@ -65,12 +69,12 @@ public interface CourseHomeworkDao extends BaseMapper<CourseHomework> {
 	CourseHomeworkDetailVo selectSubjectAndTeacherInfo(@Param("courseGroupId") Long courseGroupId);
 
 	/**
-	 * 查询课程组声部信息
+	 * 查询课程组声部信息 和课程组信息
 	 *
 	 * @param records 课程组id集合
 	 * @return
 	 */
-	List<CourseHomeworkVo> selectSubjectInfoList(@Param("records") List<CourseHomeworkVo> records);
+	List<CourseHomeworkVo> selectSubjectAndGroupInfoList(@Param("records") List<CourseHomeworkVo> records);
 
 	/**
 	 * 查询课程老师信息和学生旷课信息
@@ -87,14 +91,32 @@ public interface CourseHomeworkDao extends BaseMapper<CourseHomework> {
 	 * @param query
 	 * @return
 	 */
-	List<CourseHomeworkVo> selectAdminPage(@Param("page") IPage<CourseHomeworkVo> page,
-										   @Param("param") HomeworkAdminSearch query);
+	List<CourseHomeworkVo> selectAdminPage(@Param("page") IPage<CourseHomeworkVo> page, @Param("param") HomeworkAdminSearch query);
+
+	/**
+	 * 琴房查询课后作业
+	 *
+	 * @param courseId 课程id
+	 * @return
+	 */
+	CourseScheduleHomeworkVo selectCourseHomeworkByCourseId(@Param("courseId") Long courseId);
+
+	/**
+	 * 查询课程学生作业
+	 *
+	 * @param courseId 课程id
+	 * @return
+	 */
+	IPage<StudentHomeworkVo> selectStudentHomeworkByCourseId(@Param("page") IPage<StudentHomeworkVo> page, @Param(
+			"courseId") Long courseId);
 
 	/**
-	 * 查询课程提交时间
+	 * 查询旷课信息
 	 *
-	 * @param courseIdList 课程id集合
+	 * @param practiceRecord
+	 * @param studentId
 	 * @return
 	 */
-	List<CourseHomeworkVo> selectSubmitTime(@Param("courseIdList") List<Long> courseIdList);
+	List<CourseHomeworkVo> selectAbsenteeism(@Param("practiceRecord") List<CourseHomeworkVo> practiceRecord,
+											 @Param("studentId") Long studentId);
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentVo;
@@ -88,5 +89,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
 
     //查询报课学员
     List<CourseScheduleStudentVo> selectUser();
+
+    List<BasicUserInfo> queryNoJoinStu(@Param("scheduleId") Long scheduleId);
 }
 

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

@@ -19,6 +19,10 @@ public class CourseHomeworkReviewDto {
     @NotNull(message = "课程ID不能为空 ")
     private Long courseScheduleId;
 
+    @ApiModelProperty(value = "学生id",required = true)
+    @NotNull(message = "学生id不能为空 ")
+    private Long studentId;
+
     @ApiModelProperty(value = "点评信息",required = true)
     @NotBlank(message = "点评信息不能为空")
     private String review;
@@ -49,4 +53,12 @@ public class CourseHomeworkReviewDto {
     public void setReview(String review) {
         this.review = review;
     }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
 }

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseScheduleHomeworkSearch.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-31
+ */
+@ApiModel("课程作业相关信息查询")
+public class CourseScheduleHomeworkSearch  extends QueryInfo {
+
+
+    @ApiModelProperty(value = "课程id",required = true)
+    @NotNull(message = "课程id不能为空")
+    private Long courseId;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+}

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class ImNetworkBaseDto {
+
+    @ApiModelProperty(value = "房间号(课程编号)",required = true)
+    private Long roomId;
+
+    public Long getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(Long roomId) {
+        this.roomId = roomId;
+    }
+}

+ 37 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
+
+    @ApiModelProperty(value = "伴奏编号",required = true)
+    private Long accompanimentId;
+
+    @ApiModelProperty(value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
+    private Integer status;
+
+    public Long getAccompanimentId() {
+        return accompanimentId;
+    }
+
+    public void setAccompanimentId(Long accompanimentId) {
+        this.accompanimentId = accompanimentId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Override
+    public String toString() {
+        return "ImNetworkMusicSheetDto{" +
+                "accompanimentId=" + accompanimentId +
+                "roomId=" + getRoomId() +
+                ", status=" + status +
+                '}';
+    }
+}

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

@@ -20,9 +20,6 @@ public class ImNetworkRoomResult extends ImNetworkRoom {
     @ApiModelProperty(value = "当前用户")
     private ImNetworkRoomMember roomMember;
 
-    @ApiModelProperty(value = "当前用户伴奏信息")
-    private List<CourseScheduleStudentMusicSheetResult> musicSheetResults;
-
     @ApiModelProperty(value = "节拍器参数")
     private ImNetworkCustomMessage midiJson = new ImNetworkCustomMessage();
 
@@ -65,12 +62,4 @@ public class ImNetworkRoomResult extends ImNetworkRoom {
     public void setRoomMember(ImNetworkRoomMember roomMember) {
         this.roomMember = roomMember;
     }
-
-    public List<CourseScheduleStudentMusicSheetResult> getMusicSheetResults() {
-        return musicSheetResults;
-    }
-
-    public void setMusicSheetResults(List<CourseScheduleStudentMusicSheetResult> musicSheetResults) {
-        this.musicSheetResults = musicSheetResults;
-    }
 }

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

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * Description 平台课后作业查询条件
@@ -34,7 +35,7 @@ public class HomeworkAdminSearch extends QueryInfo {
     private Date endTime;
 
     @ApiModelProperty(value = "课程类型: PRACTICE 陪练课; LIVE 直播课",hidden = true)
-    private CourseScheduleEnum courseType;
+    private List<CourseScheduleEnum> courseType;
 
     @ApiModelProperty(value = "课程状态: NOT_START:未开始; ING:进行中; COMPLETE:已完成; CANCEL:已取消",hidden = true)
     private CourseScheduleEnum courseStatus;
@@ -74,11 +75,11 @@ public class HomeworkAdminSearch extends QueryInfo {
         this.endTime = endTime;
     }
 
-    public CourseScheduleEnum getCourseType() {
+    public List<CourseScheduleEnum> getCourseType() {
         return courseType;
     }
 
-    public void setCourseType(CourseScheduleEnum courseType) {
+    public void setCourseType(List<CourseScheduleEnum> courseType) {
         this.courseType = courseType;
     }
 

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

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * Description 课后作业查询条件
@@ -22,8 +23,8 @@ public class HomeworkSearch extends QueryInfo {
     @ApiModelProperty(value = "老师id",hidden = true)
     private Long teacherId;
 
-    @ApiModelProperty(value = "课程类型: PRACTICE 陪练课; LIVE 直播课",hidden = true)
-    private CourseScheduleEnum courseType;
+    @ApiModelProperty(value = "课程类型: PRACTICE 陪练课; LIVE 直播课 PIANO_ROOM_CLASS 琴房",hidden = true)
+    private List<CourseScheduleEnum> courseType;
 
     @ApiModelProperty(value = "课程状态: NOT_START:未开始; ING:进行中; COMPLETE:已完成; CANCEL:已取消",hidden = true)
     private CourseScheduleEnum courseStatus;
@@ -72,11 +73,11 @@ public class HomeworkSearch extends QueryInfo {
         this.teacherId = teacherId;
     }
 
-    public CourseScheduleEnum getCourseType() {
+    public List<CourseScheduleEnum> getCourseType() {
         return courseType;
     }
 
-    public void setCourseType(CourseScheduleEnum courseType) {
+    public void setCourseType(List<CourseScheduleEnum> courseType) {
         this.courseType = courseType;
     }
 

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMember.java

@@ -5,11 +5,13 @@ import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.dto.CourseScheduleStudentMusicSheetResult;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 网络教室成员(ImNetworkRoomMember)表实体类
@@ -67,6 +69,17 @@ public class ImNetworkRoomMember implements Serializable {
     @ApiModelProperty(value = "是否举手")
     private boolean handFlag;
 
+    @ApiModelProperty(value = "当前用户伴奏信息")
+    private List<CourseScheduleStudentMusicSheetResult> musicSheetResults;
+
+    public List<CourseScheduleStudentMusicSheetResult> getMusicSheetResults() {
+        return musicSheetResults;
+    }
+
+    public void setMusicSheetResults(List<CourseScheduleStudentMusicSheetResult> musicSheetResults) {
+        this.musicSheetResults = musicSheetResults;
+    }
+
     public String getUsername() {
         return username;
     }

+ 11 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseHomeworkService.java

@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSubmitDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseScheduleHomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkAdminSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo;
 
 /**
  * 课程作业表 服务类
@@ -34,9 +36,10 @@ public interface CourseHomeworkService extends IService<CourseHomework>  {
 	 * 课程详情 课后作业信息
 	 *
 	 * @param courseId 课程id
+	 * @param studentId
 	 * @return 课后作业信息
 	 */
-	CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId);
+	CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId, Long studentId);
 
 	/**
 	 * 老师布置作业
@@ -72,4 +75,11 @@ public interface CourseHomeworkService extends IService<CourseHomework>  {
 	IPage<CourseHomeworkVo>  selectAdminPage(IPage<CourseHomeworkVo> page, HomeworkAdminSearch query);
 
 
+	/**
+	 * 琴房课-课后作业信息
+	 *
+	 * @param query 课程id
+	 * @return
+	 */
+	CourseScheduleHomeworkVo getCourseHomeworkDetailByCourseId(CourseScheduleHomeworkSearch query);
 }

+ 1 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -5,9 +5,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
 import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetDownloadData;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -38,7 +36,7 @@ public interface CourseScheduleStudentPaymentService extends IService<CourseSche
      * @param courseId 课程id
      * @return 购买记录
      */
-    CourseScheduleStudentPayment getByCourseId(Long courseId);
+    List<CourseScheduleStudentPayment> getByCourseId(Long courseId);
 
     /**
      * 查询购买直播课的订单

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java

@@ -7,6 +7,8 @@ import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
+import java.util.List;
+
 /**
  * 网络教室房间(ImNetworkRoom)表服务接口
  *
@@ -36,7 +38,7 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception;
 
     //老师通知学员下载伴奏
-    void pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception;
+    void pushDownloadMusicSheetMsg(ImNetworkMusicSheetDto musicSheetDto) throws Exception;
 
     //移动端用来渲染页面
     void display(ImNetworkDisplayDataDto displayData) throws Exception;
@@ -54,9 +56,12 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     void rejectControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception;
 
     //学员伴奏下载状态回调
-    void musicSheetDownNotify(String roomId, Long accompanimentId, Integer status) throws Exception;
+    void musicSheetDownNotify(ImNetworkMusicSheetDto musicSheetDto) throws Exception;
 
     //学员设备状态同步
     void deviceStatusSync(ImNetworkDeviceControlDto deviceStatusSync) throws Exception;
+
+    //查询不在教室的学员
+    List<BasicUserInfo> queryNoJoinStu(Long roomId);
 }
 

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

@@ -8,19 +8,22 @@ import com.yonge.cooleshow.biz.dal.dao.CourseHomeworkDao;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSubmitDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseScheduleHomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkAdminSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseHomework;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
-import com.yonge.cooleshow.biz.dal.entity.SysMessageConfig;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 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.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
@@ -31,10 +34,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -57,9 +57,6 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
-    private SysMessageConfigService sysMessageConfigService;
-
-    @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
 
 	@Override
@@ -75,36 +72,98 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         if (CollectionUtils.isEmpty(records)) {
             return courseHomeworkVoIPage;
         }
-        // 学生信息
-        List<CourseHomeworkVo> studentInfoList = baseMapper.selectStudentInfo(records);
+        List<CourseHomeworkVo> practiceRecord = records.stream()
+                            .filter(courseHomeworkVo -> courseHomeworkVo.getType().getCode().equals(CourseScheduleEnum.PRACTICE.getCode()))
+                            .collect(Collectors.toList());
+
+        // 学生信息 陪练课展示
+        List<CourseHomeworkVo> studentInfoList = new ArrayList<>();
+        if (CollectionUtils.isEmpty(practiceRecord)) {
+            studentInfoList = new ArrayList<>();
+        } else{
+            baseMapper.selectStudentInfo(practiceRecord);
+        }
+        if (CollectionUtils.isEmpty(studentInfoList)) {
+            studentInfoList = new ArrayList<>();
+        }
+        Map<Long, List<CourseHomeworkVo>> studentCollect = studentInfoList.stream()
+                .collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
 
-        // 旷课状态 和老师信息
+        // 老师信息
         List<CourseHomeworkVo> teacherInfoList = baseMapper.selectTeacherInfo(records);
+        if (CollectionUtils.isEmpty(teacherInfoList)) {
+            teacherInfoList = new ArrayList<>();
+        }
+        Map<Long, List<CourseHomeworkVo>> teacherCollect = teacherInfoList.stream()
+                      .collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
+
+        // 旷课状态  学生端展示
+        Map<Long, List<CourseHomeworkVo>> absenteeismCollect = new HashMap<>();
+        if (query.getStudentId() != null) {
+            List<CourseHomeworkVo> absenteeismList = baseMapper.selectAbsenteeism(records,query.getStudentId());
+            if (CollectionUtils.isEmpty(absenteeismList)) {
+                absenteeismList = new ArrayList<>();
+            }
+            absenteeismCollect = absenteeismList.stream().collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
+        }
+
 
         // 声部信息
-        List<CourseHomeworkVo> subjectList = baseMapper.selectSubjectInfoList(records);
-        for (int i = 0; i < records.size(); i++) {
-            records.get(i).setStudentId(studentInfoList.get(i).getStudentId());
-            records.get(i).setStudentAvatar(studentInfoList.get(i).getStudentAvatar());
-            records.get(i).setStudentName(studentInfoList.get(i).getStudentName());
-            records.get(i).setSubjectName(subjectList.get(i).getSubjectName());
-            records.get(i).setTeacherAvatar(teacherInfoList.get(i).getTeacherAvatar());
-            records.get(i).setTeacherId(teacherInfoList.get(i).getTeacherId());
-            records.get(i).setTeacherName(teacherInfoList.get(i).getTeacherName());
-            records.get(i).setAbsenteeism(teacherInfoList.get(i).getAbsenteeism());
+        List<CourseHomeworkVo> subjectList = baseMapper.selectSubjectAndGroupInfoList(records);
+
+        if (CollectionUtils.isEmpty(subjectList)) {
+            subjectList = new ArrayList<>();
+        }
+        Map<Long, List<CourseHomeworkVo>>subjectCollect = subjectList.stream()
+                      .collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
+
+        for (CourseHomeworkVo record : records) {
+            List<CourseHomeworkVo> courseHomeworkVoList = studentCollect.get(record.getCourseId());
+            CourseHomeworkVo courseHomeworkVo;
+            if (!CollectionUtils.isEmpty(courseHomeworkVoList)) {
+                courseHomeworkVo = courseHomeworkVoList.get(0);
+                record.setStudentId(courseHomeworkVo.getStudentId());
+                record.setStudentAvatar(courseHomeworkVo.getStudentAvatar());
+                record.setStudentName(courseHomeworkVo.getStudentName());
+            }
+            courseHomeworkVoList = teacherCollect.get(record.getCourseId());
+            if (!CollectionUtils.isEmpty(courseHomeworkVoList)) {
+                courseHomeworkVo = courseHomeworkVoList.get(0);
+                record.setTeacherId(courseHomeworkVo.getTeacherId());
+                record.setTeacherName(courseHomeworkVo.getTeacherName());
+                record.setTeacherAvatar(courseHomeworkVo.getTeacherAvatar());
+            }
+            courseHomeworkVoList = absenteeismCollect.get(record.getCourseId());
+            if (!CollectionUtils.isEmpty(courseHomeworkVoList)) {
+                courseHomeworkVo = courseHomeworkVoList.get(0);
+                record.setAbsenteeism(courseHomeworkVo.getAbsenteeism());
+            } else {
+                record.setAbsenteeism(YesOrNoEnum.NO);
+            }
+            courseHomeworkVoList = subjectCollect.get(record.getCourseId());
+            if (!CollectionUtils.isEmpty(courseHomeworkVoList)) {
+                courseHomeworkVo = courseHomeworkVoList.get(0);
+                record.setCourseGroupName(courseHomeworkVo.getCourseGroupName());
+                record.setSubjectName(courseHomeworkVo.getSubjectName());
+                record.setClassNum(courseHomeworkVo.getClassNum());
+            }
         }
         return courseHomeworkVoIPage;
     }
 
     @Override
-    public CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId) {
+    public CourseHomeworkDetailVo getCourseHomeworkDetailByCourseId(Long courseId, Long studentId) {
 
         // 课程基本信息
-        CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper.selectCourseHomeworkDetailByCourseId(courseId);
+        CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper.selectCourseHomeworkDetailByCourseId(courseId,studentId);
+
+        if (courseHomeworkDetailVo == null) {
+            throw  new BizException("未找到作业信息");
+        }
 
         // 学生信息
         CourseHomeworkDetailVo studentInfoDetailVo = baseMapper
-                .selectPaymentStudentInfo(courseHomeworkDetailVo.getCourseScheduleId());
+                .selectPaymentStudentInfo(courseHomeworkDetailVo.getCourseScheduleId(),studentId);
 
         // 声部信息
         CourseHomeworkDetailVo subjectAndTeacherInfoVo = baseMapper
@@ -158,17 +217,26 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
      * @param teacherId 老师id
      */
     private void sendDecorateHomework(Long courseScheduleId,Long teacherId) {
-        CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentService.getByCourseId(
+        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getByCourseId(
                 courseScheduleId);
-        SysUser student = sysUserFeignService.queryUserById(courseScheduleStudentPayment.getUserId());
+        if (paymentList.isEmpty()) {
+            return;
+        }
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
-        Map<Long,String> studentReceivers = new HashMap<>();
-        studentReceivers.put(student.getId(), student.getPhone());
-
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_DECORATE_HOMEWORK.getCode());
+        for (CourseScheduleStudentPayment courseScheduleStudentPayment : paymentList) {
+            SysUser student = sysUserFeignService.queryUserById(courseScheduleStudentPayment.getUserId());
+            Map<Long,String> studentReceivers = new HashMap<>();
+            studentReceivers.put(student.getId(), student.getPhone());
 
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_DECORATE_HOMEWORK,
-         studentReceivers, null, 0,url + courseScheduleId , ClientEnum.STUDENT.getCode(),teacher.getUsername());
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum
+                       .TEACHER_DECORATE_HOMEWORK,studentReceivers, null, 0,url + courseScheduleId ,
+                       ClientEnum.STUDENT.getCode(),teacher.getUsername());
+            } catch (Exception e) {
+                log.warn("老师布置作业消息发送失败  学生id:{}",student.getId());
+            }
+        }
     }
 
     /**
@@ -180,7 +248,6 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     private CourseHomework checkHasHomework(Long courseScheduleId) {
         List<CourseHomework> list = this.lambdaQuery()
                                         .eq(CourseHomework::getCourseScheduleId, courseScheduleId)
-                                        .eq(CourseHomework::getCourseGroupType, CourseScheduleEnum.PRACTICE.getCode())
                                         .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
@@ -201,7 +268,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
         // 课程基本信息
         CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper
-                .selectCourseHomeworkDetailByCourseId(reviewDto.getCourseScheduleId());
+                .selectCourseHomeworkDetailByCourseId(reviewDto.getCourseScheduleId(), reviewDto.getStudentId());
 
         // 检查学生是否提交作业
         if (!YesOrNoEnum.YES.getCode().equals(courseHomeworkDetailVo.getSubmitHomework().getCode())) {
@@ -242,7 +309,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         }
         // 课程基本信息
         CourseHomeworkDetailVo courseHomeworkDetailVo = baseMapper
-                .selectCourseHomeworkDetailByCourseId(submitDto.getCourseScheduleId());
+                .selectCourseHomeworkDetailByCourseId(submitDto.getCourseScheduleId(), submitDto.getStudentId());
 
         // 检查老师是否评价作业
         if (YesOrNoEnum.YES.getCode().equals(courseHomeworkDetailVo.getReviewHomework().getCode())) {
@@ -287,22 +354,25 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
     @Override
     public IPage<CourseHomeworkVo> selectAdminPage(IPage<CourseHomeworkVo> page, HomeworkAdminSearch query) {
-        IPage<CourseHomeworkVo> courseHomeworkVoIPage = page.setRecords(baseMapper.selectAdminPage(page, query));
+        return page.setRecords(baseMapper.selectAdminPage(page, query));
+    }
 
-        List<CourseHomeworkVo> records = courseHomeworkVoIPage.getRecords();
-        List<Long> courseIdList = records
-                      .stream()
-                      .map(CourseHomeworkVo::getCourseId)
-                      .collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(courseIdList)) {
-            return courseHomeworkVoIPage;
-        }
-        // 查询提交时间
-        List<CourseHomeworkVo> courseHomeworkVoList = baseMapper.selectSubmitTime(courseIdList);
-        for (int i = 0; i < records.size(); i++) {
-            records.get(i).setSubmitTime(courseHomeworkVoList.get(i).getSubmitTime());
+    @Override
+    public CourseScheduleHomeworkVo getCourseHomeworkDetailByCourseId(CourseScheduleHomeworkSearch query) {
+        //  查询课程作业信息
+        CourseScheduleHomeworkVo courseScheduleHomeworkVo = baseMapper
+                .selectCourseHomeworkByCourseId(query.getCourseId());
+        if (courseScheduleHomeworkVo == null) {
+            return courseScheduleHomeworkVo;
         }
-        return courseHomeworkVoIPage;
+
+        // 课程人员作业
+        IPage<StudentHomeworkVo> studentHomeworkList = baseMapper
+                .selectStudentHomeworkByCourseId(PageUtil.getPage(query),query.getCourseId());
+
+        courseScheduleHomeworkVo.setStudentHomeworkList(studentHomeworkList);
+        return courseScheduleHomeworkVo;
+
     }
 
     /**
@@ -313,8 +383,9 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     private void checkCourseSchedule(Long courseScheduleId) {
         // 1. 检查课程类型
         CourseSchedule courseSchedule = courseScheduleService.getById(courseScheduleId);
-        if (!CourseScheduleEnum.PRACTICE.getCode().equals(courseSchedule.getType())) {
-            throw  new BizException("非陪练课,不能布置课后作业");
+        if (!CourseScheduleEnum.PRACTICE.getCode().equals(courseSchedule.getType())
+                && !CourseScheduleEnum.PIANO_ROOM_CLASS.getCode().equals(courseSchedule.getType())) {
+            throw new BizException("不能布置课后作业");
         }
         // 2. 检查课程结束
         if (!CourseScheduleEnum.COMPLETE.getCode().equals(courseSchedule.getStatus())) {
@@ -333,7 +404,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         CourseHomework courseHomework = new CourseHomework();
         courseHomework.setId(saveDto.getCourseHomeworkId());
         courseHomework.setCourseGroupId(courseSchedule.getCourseGroupId());
-        courseHomework.setCourseGroupType(CourseScheduleEnum.PRACTICE.getCode());
+        courseHomework.setCourseGroupType(courseSchedule.getType());
         courseHomework.setCourseScheduleId(saveDto.getCourseScheduleId());
         courseHomework.setTitle(saveDto.getTitle());
         courseHomework.setContent(saveDto.getContent());

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

@@ -739,6 +739,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     @Override
     public boolean checkTeacherCourseSchedule(Long teacherId, Long courseId) {
         CourseSchedule courseSchedule = this.getById(courseId);
+        if (courseSchedule == null) {
+            return false;
+        }
         return teacherId.equals(courseSchedule.getTeacherId());
     }
 
@@ -753,9 +756,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
     @Override
     public boolean checkStudentCourseSchedule(Long studentId, Long courseId) {
-        CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentService
-                .getByCourseId(courseId);
-        return courseScheduleStudentPayment != null && studentId.equals(courseScheduleStudentPayment.getUserId());
+        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getByCourseId(courseId);
+        for (CourseScheduleStudentPayment courseScheduleStudentPayment : paymentList) {
+            if (courseScheduleStudentPayment != null && studentId.equals(courseScheduleStudentPayment.getUserId())) {
+                return true;
+            }
+        }
+        return false;
 
     }
 

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

@@ -10,15 +10,14 @@ import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleStudentPaymentService;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -52,17 +51,19 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
     }
 
     @Override
-    public CourseScheduleStudentPayment getByCourseId(Long courseId) {
+    public List<CourseScheduleStudentPayment> getByCourseId(Long courseId) {
+        List<CourseScheduleEnum> courseScheduleEnumList = new ArrayList<>();
+        courseScheduleEnumList.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        courseScheduleEnumList.add(CourseScheduleEnum.PRACTICE);
         List<CourseScheduleStudentPayment> list = this.lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getCourseId, courseId)
-                .eq(CourseScheduleStudentPayment::getCourseType,
-                        CourseScheduleEnum.PRACTICE.getCode())
+                .in(CourseScheduleStudentPayment::getCourseType,courseScheduleEnumList)
                 .isNotNull(CourseScheduleStudentPayment::getUserId)
                 .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }
-        return list.get(0);
+        return list;
     }
 
     @Override

+ 60 - 31
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java

@@ -26,6 +26,9 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -99,14 +102,16 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         //如果是老师,重置节拍器数据
         if(userRole == UserRoleEnum.TEACHER){
             courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
+            //获取所有学员的伴奏下载详情
+            setMusicSheetList(roomMemberList,courseScheduleId);
         }else {
             //获取节拍器信息
             joinRoomResult.setMidiJson(courseScheduleStudentPaymentService.getMemberMidi(courseScheduleId,sysUser.getUserId()));
         }
-        //获取用户已下载的伴奏列表
-        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().
-                queryBySheetIdAndCourseId(null,courseScheduleId,sysUser.getUserId(),null,null);
-        joinRoomResult.setMusicSheetResults(musicSheetResults);
+//        //获取用户已下载的伴奏列表
+//        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().
+//                queryBySheetIdAndCourseId(null,courseScheduleId,sysUser.getUserId(),null,null);
+//        joinRoomResult.setMusicSheetResults(musicSheetResults);
         //课程结束后关闭教室的时间
         String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
         joinRoomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
@@ -121,6 +126,21 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         return HttpResponseResult.succeed(joinRoomResult);
     }
 
+    private void setMusicSheetList(List<ImNetworkRoomMember> roomMemberList,Long courseScheduleId){
+        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().
+                queryBySheetIdAndCourseId(null,courseScheduleId,null,null,null);
+        if (!CollectionUtils.isEmpty(musicSheetResults)) {
+            //分组塞到学员列表中
+            Map<Long, List<CourseScheduleStudentMusicSheetResult>> musicSheetResultMap = musicSheetResults.stream().
+                    collect(Collectors.groupingBy(e -> e.getUserId()));
+            roomMemberList.forEach(e -> {
+                if (musicSheetResultMap.containsKey(e.getUserId())) {
+                    e.setMusicSheetResults(musicSheetResultMap.get(e.getUserId()));
+                }
+            });
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void joinRoomSuccess(String roomId,Long userId) throws Exception {
@@ -202,10 +222,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     @Transactional(rollbackFor = Exception.class)
     public void leaveRoomSuccess(String roomId, Long userId) throws Exception {
         log.info("leaveRoomSuccess: roomId={}, userId={}", roomId, userId);
-        CourseSchedule courseSchedule = courseScheduleService.getById(roomId);
-        if(Objects.isNull(courseSchedule)){
-            return;
-        }
+        CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
+                .orElseThrow(()->new BizException("房间信息不存在"));
         UserRoleEnum roleEnum = UserRoleEnum.STUDENT;
         if(Objects.equals(courseSchedule.getTeacherId(),userId)){
             roleEnum = UserRoleEnum.TEACHER;
@@ -253,11 +271,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
+    public void pushDownloadMusicSheetMsg(ImNetworkMusicSheetDto musicSheetDto) throws Exception {
+        Long courseScheduleId = Optional.ofNullable(musicSheetDto).map(ImNetworkBaseDto::getRoomId).orElseThrow(() -> new BizException("房间编号不能为空"));
+        Long accompanimentId = Optional.ofNullable(musicSheetDto).map(ImNetworkMusicSheetDto::getAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
         Long userId = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
                 map(SysUser::getId).
                 orElseThrow(()-> new BizException("请登录"));
-        Long courseScheduleId = Long.parseLong(roomId);
         List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().
                 queryBySheetIdAndCourseId(accompanimentId, courseScheduleId, null, null, 0);
 
@@ -285,7 +304,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         }
         ImNetworkMusicSheetDownloadMessage msg = new ImNetworkMusicSheetDownloadMessage(
                 JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkMusicSheetDownloadMessageContent.class));
-        imHelper.publishMessage(userId.toString(), roomId, msg, 0);
+        imHelper.publishMessage(userId.toString(), courseScheduleId.toString(), msg, 0);
     }
 
     @Override
@@ -482,9 +501,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
                 orElseThrow(()->new BizException("房间信息不存在"));
         imHelper.publishMessage(sysUser.getId().toString(),teacherId.toString(), deviceControl.getRoomId(), msg);
 
-        ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
-        deviceResourceMessage.setUserId(sysUser.getId().toString());
-        imHelper.publishMessage(sysUser.getId().toString(), deviceControl.getRoomId(), deviceResourceMessage, 1);
+        //发送设备状态变更消息
+        this.sendDeviceStateChangedMessage(deviceControl, sysUser.getId(),100);
     }
 
     @Override
@@ -524,10 +542,21 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
                 deviceType == ImNetworkDeviceTypeEnum.MUSIC_MODE){
             imNetworkRoomMemberService.getDao().updateById(roomMember);
         }
-        ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceType.ordinal(),deviceStatusSync.getEnable());
-        deviceResourceMessage.setUserId(userId.toString());
+        //发送设备状态同步消息
         ImNetworkRoom room = baseMapper.findByRoomId(deviceStatusSync.getRoomId());
-        deviceResourceMessage.setSoundVolume(room.getSoundVolume());
+        this.sendDeviceStateChangedMessage(deviceStatusSync,userId,room.getSoundVolume());
+    }
+
+    @Override
+    public List<BasicUserInfo> queryNoJoinStu(Long roomId) {
+        return courseScheduleStudentPaymentService.getDao().queryNoJoinStu(roomId);
+    }
+
+    //发送设备状态同步消息
+    private void sendDeviceStateChangedMessage(ImNetworkDeviceControlDto deviceStatusSync,Long userId,Integer soundVolume) throws Exception {
+        ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceStatusSync.getDeviceType().ordinal(),deviceStatusSync.getEnable());
+        deviceResourceMessage.setUserId(userId.toString());
+        deviceResourceMessage.setSoundVolume(soundVolume);
         imHelper.publishMessage(userId.toString(), deviceStatusSync.getRoomId(), deviceResourceMessage, 1);
     }
 
@@ -550,28 +579,28 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void musicSheetDownNotify(String roomId, Long accompanimentId, Integer status) throws Exception {
-        log.info("musicSheetDownNotify: roomId={},accompanimentId={},status={}", roomId,accompanimentId,status);
+    public void musicSheetDownNotify(ImNetworkMusicSheetDto musicSheetDto) throws Exception {
+        Long roomId = Optional.ofNullable(musicSheetDto).map(ImNetworkBaseDto::getRoomId).orElseThrow(() -> new BizException("房间编号不能为空"));
+        Long accompanimentId = Optional.ofNullable(musicSheetDto).map(ImNetworkMusicSheetDto::getAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
+        Integer status = Optional.ofNullable(musicSheetDto).map(ImNetworkMusicSheetDto::getStatus).orElseThrow(() -> new BizException("伴奏下载状态不能为空"));
+        log.info("musicSheetDownNotify: musicSheetDto={}", musicSheetDto);
         Long userId = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
                 map(SysUser::getId).
                 orElseThrow(()-> new BizException("请登录"));
-        Long scheduleId = Long.parseLong(roomId);
-        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(accompanimentId, scheduleId,userId, null, null);
+        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(accompanimentId, roomId,userId, null, null);
         if(CollectionUtils.isEmpty(studentMusicSheetResults)){
             return;
         }
-        if (accompanimentId != null) {
-            Optional.ofNullable(musicSheetAccompanimentService.getById(accompanimentId)).
-                    orElseThrow(()-> new BizException("曲目信息不存在"));
-            //修改下载状态
-            CourseScheduleStudentMusicSheetResult musicSheetResult = studentMusicSheetResults.get(0);
-            musicSheetResult.setDownStatus(status);
-            courseScheduleStudentMusicSheetService.updateById(musicSheetResult);
-        }
+        Optional.ofNullable(musicSheetAccompanimentService.getById(accompanimentId)).
+                orElseThrow(()-> new BizException("曲目信息不存在"));
+        //修改下载状态
+        CourseScheduleStudentMusicSheetResult musicSheetResult = studentMusicSheetResults.get(0);
+        musicSheetResult.setDownStatus(status);
+        courseScheduleStudentMusicSheetService.updateById(musicSheetResult);
         //给老师发送学员曲目下载状态
-        CourseSchedule courseSchedule = courseScheduleService.getById(scheduleId);
+        CourseSchedule courseSchedule = courseScheduleService.getById(roomId);
         ImNetworkMusicSheetDownloadStatusMessage statusMessage = new ImNetworkMusicSheetDownloadStatusMessage(status,studentMusicSheetResults);
-        imHelper.publishMessage(userId.toString(), courseSchedule.getTeacherId().toString(), roomId, statusMessage);
+        imHelper.publishMessage(userId.toString(), courseSchedule.getTeacherId().toString(), roomId.toString(), statusMessage);
     }
 
     //校验用户是否提前进入教室

+ 56 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -19,10 +20,25 @@ public class CourseHomeworkVo{
 	@ApiModelProperty("课程编号ID")
 	private Long courseId;
 
+	@ApiModelProperty("课后作业id")
+	private Long homeworkId;
+
 
 	@ApiModelProperty("课程组ID")
 	private Long courseGroupId;
 
+	@ApiModelProperty("课程组名")
+	private String courseGroupName;
+
+	@ApiModelProperty("课程背景图")
+	private String backgroundPic;
+
+	@ApiModelProperty("课程类型")
+	private CourseScheduleEnum type;
+
+	@ApiModelProperty("课堂编号-第几堂课")
+	private Integer classNum;
+
 
 	@ApiModelProperty("上课日期")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -188,4 +204,44 @@ public class CourseHomeworkVo{
 	public void setAbsenteeism(YesOrNoEnum absenteeism) {
 		this.absenteeism = absenteeism;
 	}
+
+	public CourseScheduleEnum getType() {
+		return type;
+	}
+
+	public void setType(CourseScheduleEnum type) {
+		this.type = type;
+	}
+
+	public Long getHomeworkId() {
+		return homeworkId;
+	}
+
+	public void setHomeworkId(Long homeworkId) {
+		this.homeworkId = homeworkId;
+	}
+
+	public Integer getClassNum() {
+		return classNum;
+	}
+
+	public void setClassNum(Integer classNum) {
+		this.classNum = classNum;
+	}
+
+	public String getCourseGroupName() {
+		return courseGroupName;
+	}
+
+	public void setCourseGroupName(String courseGroupName) {
+		this.courseGroupName = courseGroupName;
+	}
+
+	public String getBackgroundPic() {
+		return backgroundPic;
+	}
+
+	public void setBackgroundPic(String backgroundPic) {
+		this.backgroundPic = backgroundPic;
+	}
 }

+ 207 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleHomeworkVo.java

@@ -0,0 +1,207 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-31
+ */
+@ApiModel("琴房课程-课后作业列表")
+public class CourseScheduleHomeworkVo {
+
+
+    @ApiModelProperty("课程编号ID")
+    private Long courseId;
+
+    @ApiModelProperty("课程组ID")
+    private Long courseGroupId;
+
+    @ApiModelProperty("课程组名")
+    private String courseGroupName;
+
+    @ApiModelProperty("课程类型")
+    private CourseScheduleEnum type;
+
+    @ApiModelProperty("课堂编号-第几堂课")
+    private Integer classNum;
+
+
+    @ApiModelProperty("上课日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date classDate;
+
+    @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("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("作业标题; ")
+    private String title;
+
+    @ApiModelProperty("作业内容 ")
+    private String content;
+
+    @ApiModelProperty("作业附件地址(多个用逗号分隔) ")
+    private String attachments;
+
+    @ApiModelProperty("布置作业,0:未布置,1:已布置")
+    private YesOrNoEnum decorateHomework;
+
+    @ApiModelProperty("作业布置时间")
+    private Date decorateTime;
+
+    @ApiModelProperty("课程背景图")
+    private String backgroundPic;
+
+    @ApiModelProperty("学生课后作业列表")
+    private IPage<StudentHomeworkVo> studentHomeworkList;
+
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public String getCourseGroupName() {
+        return courseGroupName;
+    }
+
+    public void setCourseGroupName(String courseGroupName) {
+        this.courseGroupName = courseGroupName;
+    }
+
+    public CourseScheduleEnum getType() {
+        return type;
+    }
+
+    public void setType(CourseScheduleEnum type) {
+        this.type = type;
+    }
+
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+
+    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 String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
+
+    public YesOrNoEnum getDecorateHomework() {
+        return decorateHomework;
+    }
+
+    public void setDecorateHomework(YesOrNoEnum decorateHomework) {
+        this.decorateHomework = decorateHomework;
+    }
+
+    public Date getDecorateTime() {
+        return decorateTime;
+    }
+
+    public void setDecorateTime(Date decorateTime) {
+        this.decorateTime = decorateTime;
+    }
+
+    public String getBackgroundPic() {
+        return backgroundPic;
+    }
+
+    public void setBackgroundPic(String backgroundPic) {
+        this.backgroundPic = backgroundPic;
+    }
+
+    public IPage<StudentHomeworkVo> getStudentHomeworkList() {
+        return studentHomeworkList;
+    }
+
+    public void setStudentHomeworkList(IPage<StudentHomeworkVo> studentHomeworkList) {
+        this.studentHomeworkList = studentHomeworkList;
+    }
+}

+ 59 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeworkVo.java

@@ -0,0 +1,59 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-31
+ */
+@ApiModel("学生课后作业信息")
+public class StudentHomeworkVo {
+
+    @ApiModelProperty("学生id")
+    private Long studentId;
+
+    @ApiModelProperty("学员姓名")
+    private String studentName;
+
+    @ApiModelProperty("学员头像")
+    private String studentAvatar;
+
+    @ApiModelProperty("学生提交作业 0:未提交,1:已提交")
+    private YesOrNoEnum submitHomework;
+
+    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 getStudentAvatar() {
+        return studentAvatar;
+    }
+
+    public void setStudentAvatar(String studentAvatar) {
+        this.studentAvatar = studentAvatar;
+    }
+
+    public YesOrNoEnum getSubmitHomework() {
+        return submitHomework;
+    }
+
+    public void setSubmitHomework(YesOrNoEnum submitHomework) {
+        this.submitHomework = submitHomework;
+    }
+}

+ 87 - 44
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -42,26 +42,34 @@
         cs.id_ AS courseId,
         cs.course_group_id_ AS courseGroupId,
         cs.class_date_ AS classDate,
+        cs.type_ as type,
         cs.start_time_ AS startTime,
         cs.end_time_ AS endTime,
         ch.create_time_ as decorateTime,
+        su2.id_ as studentId,
         su2.username_ as studentName,
         su2.avatar_ as studentAvatar,
         su.username_ as teacherName,
         su.avatar_ as teacherAvatar,
+        sch.submit_time_ as submitTime,
+        su.id_ as teacherId,
         ch.create_time_ as decorateTime
         from  course_homework ch
         left join course_schedule cs on ch.course_schedule_id_ = cs.id_
         left join course_schedule_student_payment cssp on cssp.course_id_ = cs.id_
         left join sys_user su on cs.teacher_id_ = su.id_
         left join sys_user su2 on cssp.user_id_ = su2.id_
+        left join student_course_homework sch on ch.id_ = sch.id_
         <where>
             <if test="param.courseStatus != null">
-                and cs.type_ = #{param.courseType}
-            </if>
-            <if test="param.courseType != null">
                 and cs.status_ = #{param.courseStatus}
             </if>
+            <if test="param.courseType != null and param.courseType.size() != 0">
+                and  cs.type_ in
+                <foreach collection="param.courseType" item="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
             <if test="param.startTime != null">
                 and #{param.startTime} &lt; ch.create_time_
             </if>
@@ -83,14 +91,15 @@
     </select>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
-        select
+        select distinct
         cs.id_ AS courseId,
         cs.course_group_id_ AS courseGroupId,
         cs.class_date_ AS classDate,
+        cs.class_num_ as classNum,
         cs.start_time_ AS startTime,
         cs.end_time_ AS endTime,
-        ch.create_time_ as decorateTime,
-        sch.submit_time_ as submitTime
+        cs.type_ as type,
+        ch.create_time_ as decorateTime
         from course_schedule cs
         left join course_homework ch on ch.course_schedule_id_ = cs.id_
         left join student_course_homework sch on ch.id_ = sch.course_homework_id_
@@ -113,11 +122,14 @@
                 </if>
             </if>
             <if test="param.courseStatus != null">
-                and cs.type_ = #{param.courseType}
-            </if>
-            <if test="param.courseType != null">
                 and cs.status_ = #{param.courseStatus}
             </if>
+            <if test="param.courseType != null and param.courseType.size() != 0">
+                and cs.type_ in
+                <foreach collection="param.courseType" separator="," close=")" open="(" item="item" >
+                    #{item}
+                </foreach>
+            </if>
             <if test="param.teacherId != null">
                 and cs.teacher_id_ = #{param.teacherId}
             </if>
@@ -166,11 +178,16 @@
         from course_schedule cs
         left join course_homework ch on ch.course_schedule_id_ = cs.id_
         left join student_course_homework sch on ch.id_ = sch.course_homework_id_
+        left join course_schedule_student_payment cssp on cs.id_ = cssp.course_id_
         <where>
             <if test="courseId != null">
-                cs.id_ = #{courseId}
+                and cs.id_ = #{courseId}
+            </if>
+            <if test="studentId != null">
+                and cssp.user_id_ = #{studentId}
             </if>
         </where>
+        limit 1
     </select>
 
 	<select id="selectPaymentStudentInfo" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo">
@@ -184,6 +201,9 @@
             <if test="courseScheduleId != null">
                 and cs.id_ = #{courseScheduleId}
             </if>
+            <if test="studentId != null">
+                and cssp.user_id_ = #{studentId}
+            </if>
         </where>
     </select>
 
@@ -205,6 +225,7 @@
 
 	<select id="selectStudentInfo" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
         select
+        cs.id_ as courseId,
         cssp.user_id_ as studentId
         ,su.username_ as studentName
         ,su.avatar_ as studentAvatar
@@ -219,17 +240,15 @@
                 </foreach>
             </if>
         </where>
-        <if test="records != null and records.size() != 0">
-            order by field(cs.id_,
-            <foreach collection="records" separator="," close=")" open="" item="item" >
-                #{item.courseId}
-            </foreach>
-        </if>
     </select>
 
-	<select id="selectSubjectInfoList" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
+	<select id="selectSubjectAndGroupInfoList" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
         select
+        cs.id_ as courseId,
         s.name_ as subjectName
+        ,cg.name_ as courseGroupName
+        ,cg.background_pic_ as backgroundPic
+        ,cs.class_num_ as classNum
         from course_schedule cs
         left join course_group cg on cs.course_group_id_ = cg.id_
         left join subject s on s.id_ = cg.subject_id_
@@ -241,23 +260,16 @@
                 </foreach>
             </if>
         </where>
-        <if test="records != null and records.size() != 0">
-            order by field(cs.id_,
-            <foreach collection="records" separator="," close=")" open="" item="item" >
-                #{item.courseId}
-            </foreach>
-        </if>
     </select>
 
 	<select id="selectTeacherInfo" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
         select
+        cs.id_ as courseId,
         cs.teacher_id_ as teacherId
         ,su.username_ as teacherName
         ,su.avatar_ as teacherAvatar
-        ,if(sa.id_ is null,1,0) as absenteeism
         from course_schedule cs
         left join sys_user su on cs.teacher_id_ = su.id_
-        left join student_attendance sa on sa.course_schedule_id_ = cs.id_
         <where>
             <if test="records != null and records.size() != 0">
                 and cs.id_ in
@@ -266,33 +278,64 @@
                 </foreach>
             </if>
         </where>
-        <if test="records != null and records.size() != 0">
-            order by field(cs.id_,
-            <foreach collection="records" separator="," close=")" open="" item="item" >
-                #{item.courseId}
-            </foreach>
-        </if>
     </select>
 
-	<select id="selectSubmitTime" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
+	<select id="selectCourseHomeworkByCourseId" resultType="com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo">
         select
-        cs.id_ as courseId,
-        sch.submit_time_ as submitTime
+            cs.id_ as courseId,
+            cg.id_ as courseGroupId,
+            cg.name_ as courseGroupName,
+            cs.type_ as type,
+            cs.class_num_ as classNum,
+            cs.class_date_ as classDate,
+            cs.start_time_ as startTime,
+            cs.end_time_ as endTime,
+            s.name_ as subjectName,
+            ch.title_ as title,
+            ch.content_ as content,
+            ch.attachments_ as attachments,
+        if(ch.id_ is null,0,1) as decorateHomework,
+        ch.create_time_ as decorateTime,
+        cg.background_pic_ as backgroundPic
+        from course_schedule  cs
+        left join course_group cg on cs.course_group_id_ = cg.id_
+        left join course_homework ch on cs.id_ = ch.course_schedule_id_
+        left join subject s on cg.subject_id_ = s.id_
+        where cs.id_ = #{courseId}
+
+    </select>
+
+	<select id="selectStudentHomeworkByCourseId" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomeworkVo">
+        select
+        s.id_ as studentId,
+        s.username_ as studentName,
+        s.phone_ as studentAvatar,
+        if(sch.id_ is not null,1,0) as submitHomework
+
+        from course_schedule_student_payment cssp
+        left join sys_user s on cssp.user_id_ = s.id_
+        left join student_course_homework sch on cssp.user_id_ = sch.student_id_ and sch.course_schedule_id_ = cssp.course_id_
+        <where>
+            <if test="courseId != null">
+                and cssp.course_id_ = #{courseId}
+            </if>
+        </where>
+    </select>
+
+	<select id="selectAbsenteeism" resultType="com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo">
+        select
+        cs.id_ as courseId
+        ,if(sa.id_ is null,1,0) as absenteeism
         from course_schedule cs
-        left join  student_course_homework sch on sch.course_schedule_id_ = cs.id_
+        left join student_attendance sa on sa.course_schedule_id_ = cs.id_
         <where>
-            <if test="courseIdList != null and courseIdList.size() != 0">
+            sa.student_id_ = #{studentId}
+            <if test="practiceRecord != null and practiceRecord.size() != 0">
                 and cs.id_ in
-                <foreach collection="courseIdList" separator="," close=")" open="(" item="item">
-                    #{item}
+                <foreach collection="practiceRecord" separator="," close=")" open="(" item="item" >
+                    #{item.courseId}
                 </foreach>
             </if>
         </where>
-        <if test="courseIdList != null and courseIdList.size() != 0">
-            order by field(cs.id_,
-            <foreach collection="courseIdList" separator="," close=")" open="" item="item" >
-                #{item}
-            </foreach>
-        </if>
     </select>
 </mapper>

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

@@ -664,7 +664,7 @@
         select count(1)
         from course_schedule cs
         left join course_homework ch on cs.id_ = ch.course_schedule_id_
-        where cs.teacher_id_ = #{userId} and cs.status_ = 'COMPLETE' and cs.type_ = 'PRACTICE'
+        where cs.teacher_id_ = #{userId} and cs.status_ = 'COMPLETE' and cs.type_ in( 'PRACTICE','PIANO_ROOM_CLASS')
         and YEARWEEK(date_format(cs.class_date_,'%Y-%m-%d'),7) = YEARWEEK(now(),7)
         and ch.id_ is null
     </select>

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

@@ -162,4 +162,12 @@
         AND NOW() &gt;= c.end_time_
         ORDER BY c.end_time_
     </select>
+    <select id="queryNoJoinStu" resultMap="com.yonge.cooleshow.biz.dal.dao.TeacherDao.BasicUserInfo">
+        SELECT CASE WHEN su.username_ IS NULL THEN su.real_name_ ELSE su.username_ END username_,
+        su.avatar_,cssp.user_id_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+        WHERE cssp.course_id_ = #{scheduleId}
+        AND NOT EXISTS (SELECT rm.user_id_ FROM im_network_room_member rm WHERE rm.room_id_ = #{scheduleId} AND rm.user_id_ = cssp.user_id_)
+    </select>
 </mapper>

+ 36 - 41
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.java

@@ -3,18 +3,14 @@ package com.yonge.cooleshow.classroom.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.dto.*;
-import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -42,12 +38,11 @@ public class ImNetworkRoomController extends BaseController {
     private ImNetworkRoomService imNetworkRoomService;
 
     @ApiOperation("加入网络教室")
-    @PostMapping(value = "/join", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    @ApiImplicitParam(name = "roomId", dataType = "Long", value = "课程编号")
-    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long roomId) throws Exception {
-        roomId = Optional.ofNullable(roomId)
-                .orElseThrow(()->new BizException("房间号不可为空"));
-        return imNetworkRoomService.joinRoom(roomId);
+    @PostMapping(value = "/join")
+    public HttpResponseResult<ImNetworkRoomResult> joinRoom(@RequestBody ImNetworkBaseDto imNetworkBaseDto) throws Exception {
+        return imNetworkRoomService.joinRoom(Optional.ofNullable(imNetworkBaseDto)
+                .map(ImNetworkBaseDto::getRoomId)
+                .orElseThrow(()->new BizException("房间号不可为空")));
     }
 
 //    @ApiOperation("加入网络教室状态回调")
@@ -58,10 +53,11 @@ public class ImNetworkRoomController extends BaseController {
 //    }
 
     @ApiOperation("加入网络教室状态回调")
-    @PostMapping(value = "joinRoomFailure", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public HttpResponseResult joinRoomFailure(Long roomId){
-        roomId = Optional.ofNullable(roomId).orElseThrow(()->new BizException("房间号不可为空"));
-        imNetworkRoomService.joinRoomFailure(roomId.toString());
+    @PostMapping(value = "joinRoomFailure")
+    public HttpResponseResult joinRoomFailure(@RequestBody ImNetworkBaseDto imNetworkBaseDto){
+        imNetworkRoomService.joinRoomFailure(Optional.ofNullable(imNetworkBaseDto)
+                .map(ImNetworkBaseDto::getRoomId)
+                .orElseThrow(()->new BizException("房间号不可为空")).toString());
         return succeed();
     }
 
@@ -83,37 +79,37 @@ public class ImNetworkRoomController extends BaseController {
     }
 
     @ApiOperation("退出网络教室")
-    @ApiImplicitParam(name = "roomId", dataType = "Long", value = "课程编号")
-    @PostMapping(value = "/leave", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public HttpResponseResult leaveRoom(Long roomId) throws Exception {
-        roomId = Optional.ofNullable(roomId).orElseThrow(()->new BizException("房间号不可为空"));
-        imNetworkRoomService.leaveRoom(roomId.toString());
+    @PostMapping(value = "/leave")
+    public HttpResponseResult leaveRoom(@RequestBody ImNetworkBaseDto imNetworkBaseDto) throws Exception {
+        imNetworkRoomService.leaveRoom(Optional.ofNullable(imNetworkBaseDto)
+                .map(ImNetworkBaseDto::getRoomId)
+                .orElseThrow(()->new BizException("房间号不可为空")).toString());
         return succeed();
     }
 
     @ApiOperation("控制学员节拍器")
-    @PostMapping(value = "/sendImPlayMidiMessage", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/sendImPlayMidiMessage")
     public HttpResponseResult sendImPlayMidiMessage(@RequestBody ImNetworkCustomMessage customMessage) throws Exception {
         imNetworkRoomService.sendImPlayMidiMessage(customMessage);
         return succeed();
     }
 
     @ApiOperation("移动端用来渲染页面")
-    @PostMapping(value = "/display", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/display")
     public HttpResponseResult display(@RequestBody ImNetworkDisplayDataDto displayData) throws Exception {
         imNetworkRoomService.display(displayData);
         return succeed();
     }
 
     @ApiOperation(value = "批量控制学员设备开关")
-    @PostMapping(value = "/device/batchControl", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/device/batchControl")
     public Object batchControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)throws Exception {
         imNetworkRoomService.batchControlDevice(deviceControl);
         return succeed();
     }
 
     @ApiOperation(value = "控制学员设备开关")
-    @PostMapping(value = "/device/control", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/device/control")
     public HttpResponseResult controlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
             throws Exception {
         imNetworkRoomService.controlDevice(deviceControl);
@@ -121,7 +117,7 @@ public class ImNetworkRoomController extends BaseController {
     }
 
     @ApiOperation(value = "学员同意打开,麦克风、摄像头")
-    @PostMapping(value = "/device/approve", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/device/approve")
     public HttpResponseResult approveControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl) throws Exception {
         deviceControl.setEnable(true);
         imNetworkRoomService.approveControlDevice(deviceControl);
@@ -129,7 +125,7 @@ public class ImNetworkRoomController extends BaseController {
     }
 
     @ApiOperation(value = "学员拒绝打开,麦克风、摄像头")
-    @PostMapping(value = "/device/reject", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/device/reject")
     public HttpResponseResult rejectControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
             throws Exception {
         deviceControl.setEnable(false);
@@ -138,34 +134,33 @@ public class ImNetworkRoomController extends BaseController {
     }
 
     @ApiOperation(value = "学员设备状态同步")
-    @PostMapping(value = "/device/sync", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/device/sync")
     public Object deviceStatusSync(@RequestBody ImNetworkDeviceControlDto deviceControl)
             throws Exception {
         imNetworkRoomService.deviceStatusSync(deviceControl);
         return succeed();
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "roomId", dataType = "String", value = "房间号",required = true),
-            @ApiImplicitParam(name = "accompanimentId", dataType = "Long", value = "伴奏编号",required = true)
-    })
     @ApiOperation(value = "老师在网络教室选择完伴奏后、通知学员下载伴奏")
-    @PostMapping(value = "pushDownloadMusicSheetMsg", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public HttpResponseResult pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
-        imNetworkRoomService.pushDownloadMusicSheetMsg(roomId,accompanimentId);
+    @PostMapping(value = "pushDownloadMusicSheetMsg")
+    public HttpResponseResult pushDownloadMusicSheetMsg(@RequestBody ImNetworkMusicSheetDto musicSheetDto) throws Exception {
+        imNetworkRoomService.pushDownloadMusicSheetMsg(musicSheetDto);
         return succeed();
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "roomId", dataType = "String", value = "房间号",required = true),
-            @ApiImplicitParam(name = "accompanimentId", dataType = "Long", value = "伴奏编号",required = false),
-            @ApiImplicitParam(name = "status", dataType = "Integer", value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
-    })
     @ApiOperation(value = "学员伴奏下载状态回调")
-    @PostMapping(value = "musicSheetDownNotify", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public HttpResponseResult adjustMusicScore(String roomId,Long accompanimentId,Integer status) throws Exception {
-        imNetworkRoomService.musicSheetDownNotify(roomId,accompanimentId,status);
+    @PostMapping(value = "musicSheetDownNotify")
+    public HttpResponseResult adjustMusicScore(@RequestBody ImNetworkMusicSheetDto musicSheetDto) throws Exception {
+        imNetworkRoomService.musicSheetDownNotify(musicSheetDto);
         return succeed();
     }
+
+    @ApiOperation(value = "查询不在教室的学员")
+    @PostMapping(value = "/queryNoJoinStu")
+    public HttpResponseResult queryNoJoinStu(@RequestBody ImNetworkBaseDto imNetworkBaseDto){
+        return succeed(imNetworkRoomService.queryNoJoinStu(Optional.ofNullable(imNetworkBaseDto)
+                .map(ImNetworkBaseDto::getRoomId)
+                .orElseThrow(()->new BizException("房间号不可为空"))));
+    }
 }
 

+ 7 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java

@@ -21,6 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Description 学生课后作业相关接口
@@ -51,7 +53,7 @@ public class CourseHomeworkController extends BaseController {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         HttpResponseResult info = checkCourseSchedule(courseId,sysUser);
         if (info != null) return info;
-        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId));
+        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId, sysUser.getId()));
     }
 
     private HttpResponseResult checkCourseSchedule(Long courseId,SysUser sysUser) {
@@ -85,7 +87,10 @@ public class CourseHomeworkController extends BaseController {
         query.setDecorate(YesOrNoEnum.YES);
         query.setStudentId(sysUser.getId());
         query.setCourseStatus(CourseScheduleEnum.COMPLETE);
-        query.setCourseType(CourseScheduleEnum.PRACTICE);
+        List<CourseScheduleEnum> list = new ArrayList<>();
+        list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        list.add(CourseScheduleEnum.PRACTICE);
+        query.setCourseType(list);
         return succeed(PageUtil.pageInfo(courseHomeworkService.selectPage(PageUtil.getPage(query),query)));
     }
 

+ 29 - 6
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
+import com.yonge.cooleshow.biz.dal.dto.CourseScheduleHomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
@@ -13,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.CountVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -23,6 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Description 老师课后作业相关接口
@@ -52,10 +56,13 @@ public class CourseHomeworkController extends BaseController {
             return failed("用户信息获取失败");
         }
         HomeworkSearch homeworkSearch = new HomeworkSearch();
-        // 默认查当前老师,陪练课 课程状态为完成,有学生考勤记录 没有学生课程记录
+        // 默认查当前老师,陪练课 课程状态为完成, 没有学生课程记录
         homeworkSearch.setTeacherId(sysUser.getId());
         homeworkSearch.setCourseStatus(CourseScheduleEnum.COMPLETE);
-        homeworkSearch.setCourseType(CourseScheduleEnum.PRACTICE);
+        List<CourseScheduleEnum> list = new ArrayList<>();
+        list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        list.add(CourseScheduleEnum.PRACTICE);
+        homeworkSearch.setCourseType(list);
         homeworkSearch.setDecorate(YesOrNoEnum.NO);
         Integer integer = courseScheduleService.countTeacherNoDecorateHomework(homeworkSearch);
         CountVo countVo = new CountVo();
@@ -64,14 +71,26 @@ public class CourseHomeworkController extends BaseController {
     }
 
     @ApiOperation(value = "首页-我的课程-课程详情(陪练课)-课后作业信息详情",notes = "传入课程编号ID")
-    @GetMapping(value = "/detail/{courseId}")
+    @GetMapping(value = "/detail/{courseId}/{studentId}")
     public HttpResponseResult<CourseHomeworkDetailVo> detail(@ApiParam(value = "课程编号ID", required = true)
-                                                                 @PathVariable("courseId") Long courseId) {
+                                                                 @PathVariable("courseId") Long courseId,
+                                                             @PathVariable("studentId") Long studentId) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         HttpResponseResult info = checkCourseSchedule(courseId,sysUser);
         if (info != null) return info;
-        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId));
+        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(courseId, studentId));
+    }
+
+
+    @ApiOperation(value = "首页-我的课程-课程详情(琴房)-课后作业列表",notes = "传入课程编号ID")
+    @PostMapping(value = "/detail/list")
+    public HttpResponseResult<CourseScheduleHomeworkVo> detail(@RequestBody @Valid CourseScheduleHomeworkSearch query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        HttpResponseResult info = checkCourseSchedule(query.getCourseId(),sysUser);
+        if (info != null) return info;
+        return succeed(courseHomeworkService.getCourseHomeworkDetailByCourseId(query));
     }
 
     private HttpResponseResult checkCourseSchedule(Long courseId,SysUser sysUser) {
@@ -113,7 +132,11 @@ public class CourseHomeworkController extends BaseController {
         }
         query.setTeacherId(sysUser.getId());
         query.setCourseStatus(CourseScheduleEnum.COMPLETE);
-        query.setCourseType(CourseScheduleEnum.PRACTICE);
+        List<CourseScheduleEnum> list = new ArrayList<>();
+        list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        list.add(CourseScheduleEnum.PRACTICE);
+        query.setCourseType(list);
+
         return succeed(PageUtil.pageInfo(courseHomeworkService.selectPage(PageUtil.getPage(query),query)));
     }