Преглед на файлове

Merge remote-tracking branch 'origin/master'

zouxuan преди 3 години
родител
ревизия
f6313b626d
променени са 58 файла, в които са добавени 991 реда и са изтрити 352 реда
  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. 85 59
      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. 4 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  20. 32 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseHomeworkDao.java
  21. 6 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
  22. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseHomeworkReviewDto.java
  23. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseScheduleHomeworkSearch.java
  24. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  25. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.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. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseHomeworkService.java
  29. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  30. 122 51
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  31. 10 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  32. 7 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  33. 23 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SubjectServiceImpl.java
  34. 3 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  35. 24 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  36. 18 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  37. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java
  38. 206 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleHomeworkVo.java
  39. 59 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeworkVo.java
  40. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherMusicSheetVo.java
  41. 87 44
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  42. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  43. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml
  44. 3 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  45. 6 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  46. 8 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  47. 7 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java
  48. 44 39
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  49. 2 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java
  50. 0 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java
  51. 29 6
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java
  52. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/UserWithdrawalClient.java
  53. 5 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java
  54. 3 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java
  55. 2 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/RefundPaymentCallBack.java
  56. 1 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  57. 16 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  58. 7 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.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;

+ 85 - 59
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -105,7 +105,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         ConfirmOrderResult result = new ConfirmOrderResult();
         //获取购物车信息
         UmsMember currentMember = memberService.getCurrentMember();
-        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds, true);
+        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds,
+                                                                                      true);
         result.setCartPromotionItemList(cartPromotionItemList);
         //获取用户收货地址列表
         List<UmsMemberReceiveAddress> memberReceiveAddressList = memberReceiveAddressService.list();
@@ -129,8 +130,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         List<OmsOrderItem> orderItemList = new ArrayList<>();
         //获取购物车及优惠信息
         UmsMember currentMember = memberService.getCurrentMember();
-        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), orderParam.getCartIds(),
-                true);
+        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(),
+                                                                                      orderParam.getCartIds(), true);
         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
             //生成下单商品信息
             OmsOrderItem orderItem = new OmsOrderItem();
@@ -179,13 +180,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         } else {
             //使用积分
             BigDecimal totalAmount = calcTotalAmount(orderItemList);
-            BigDecimal integrationAmount = getUseIntegrationAmount(orderParam.getUseIntegration(), totalAmount, currentMember, orderParam.getCouponId() != null);
+            BigDecimal integrationAmount = getUseIntegrationAmount(orderParam.getUseIntegration(), totalAmount,
+                                                                   currentMember, orderParam.getCouponId() != null);
             if (integrationAmount.compareTo(new BigDecimal(0)) == 0) {
                 Asserts.fail("积分不可用");
             } else {
                 //可用情况下分摊到可用商品中
                 for (OmsOrderItem orderItem : orderItemList) {
-                    BigDecimal perAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(integrationAmount);
+                    BigDecimal perAmount = orderItem.getProductPrice()
+                                                    .divide(totalAmount, 3, RoundingMode.HALF_EVEN)
+                                                    .multiply(integrationAmount);
                     orderItem.setIntegrationAmount(perAmount);
                 }
             }
@@ -200,11 +204,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
         OmsOrder order = new OmsOrder();
-        StringBuilder cartIds = new StringBuilder();
-        for (Long cartId : orderParam.getCartIds()) {
-            cartIds.append(cartId.toString());
-        }
-        order.setCartIds(cartIds.toString());
+        String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining());
+        order.setCartIds(cartIds);
         order.setDiscountAmount(new BigDecimal(0));
         order.setTotalAmount(calcTotalAmount(orderItemList));
         order.setFreightAmount(new BigDecimal(0));
@@ -273,7 +274,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         //如使用积分需要扣除积分
         if (orderParam.getUseIntegration() != null) {
             order.setUseIntegration(orderParam.getUseIntegration());
-            memberService.updateIntegration(currentMember.getId(), currentMember.getIntegration() - orderParam.getUseIntegration());
+            memberService.updateIntegration(currentMember.getId(),
+                                            currentMember.getIntegration() - orderParam.getUseIntegration());
         }
         //删除购物车中的下单商品
         deleteCartItemList(cartPromotionItemList, currentMember);
@@ -306,18 +308,19 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
     /**
-     *  减商品库存
+     * 减商品库存
      */
     private void updateProductStock(OmsOrderDetail orderDetail) {
         Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
-                   .stream().collect(Collectors.groupingBy(OmsOrderItem::getProductId));
+                                                           .stream()
+                                                           .collect(Collectors.groupingBy(OmsOrderItem::getProductId));
 
         List<ProductStock> productStockList = new ArrayList<>();
         for (Map.Entry<Long, List<OmsOrderItem>> entry : collect.entrySet()) {
             ProductStock stock = new ProductStock();
             stock.setProductId(entry.getKey());
             List<OmsOrderItem> value = entry.getValue();
-            if(CollectionUtils.isEmpty(value)) {
+            if (CollectionUtils.isEmpty(value)) {
                 continue;
             }
             int sum = value.stream().mapToInt(OmsOrderItem::getProductQuantity).sum();
@@ -332,8 +335,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         Integer count = 0;
         OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
         //查询超时、未支付的订单及订单详情
-        List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime()
-                , orderSetting.getPayOrderOvertime());
+        List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime(),
+                                                                             orderSetting.getPayOrderOvertime());
         if (CollectionUtils.isEmpty(timeOutOrders)) {
             return count;
         }
@@ -375,10 +378,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             //返还使用积分
             if (cancelOrder.getUseIntegration() != null) {
                 UmsMember member = memberService.getById(cancelOrder.getMemberId());
-                memberService.updateIntegration(cancelOrder.getMemberId(), member.getIntegration() + cancelOrder.getUseIntegration());
+                memberService.updateIntegration(cancelOrder.getMemberId(),
+                                                member.getIntegration() + cancelOrder.getUseIntegration());
             }
             // 发起关单
-            userOrderPaymentService.closePayment(cancelOrder.getOrderSn(),message,data);
+            userOrderPaymentService.closePayment(cancelOrder.getOrderSn(), message, data);
 
         }
     }
@@ -417,8 +421,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         PageHelper.startPage(pageNum, pageSize);
         OmsOrderExample orderExample = new OmsOrderExample();
         OmsOrderExample.Criteria criteria = orderExample.createCriteria();
-        criteria.andDeleteStatusEqualTo(0)
-                .andMemberIdEqualTo(member.getId());
+        criteria.andDeleteStatusEqualTo(0).andMemberIdEqualTo(member.getId());
         if (status != null && !StringUtil.isEmpty(status)) {
             List<Long> list = StringUtil.toLongList(status);
             List<Integer> collect = list.stream().map(Long::intValue).collect(Collectors.toList());
@@ -445,7 +448,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         for (OmsOrder omsOrder : orderList) {
             OmsOrderDetail orderDetail = new OmsOrderDetail();
             BeanUtil.copyProperties(omsOrder, orderDetail);
-            List<OmsOrderItem> relatedItemList = orderItemList.stream().filter(item -> item.getOrderId().equals(orderDetail.getId())).collect(Collectors.toList());
+            List<OmsOrderItem> relatedItemList = orderItemList.stream()
+                                                              .filter(item -> item.getOrderId()
+                                                                                  .equals(orderDetail.getId()))
+                                                              .collect(Collectors.toList());
             orderDetail.setOrderItemList(relatedItemList);
             orderDetailList.add(orderDetail);
         }
@@ -514,8 +520,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderPayRes.setMessage("订单已付款或已关闭");
             return orderPayRes;
         }
-        UserOrderPayment userOrderPayment = userOrderPaymentService
-                .getByOrderNo(detail.getOrderSn(), payReq.getPayChannel(), TradeStatusEnum.pending);
+        UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNo(detail.getOrderSn(),
+                                                                                 payReq.getPayChannel(),
+                                                                                 TradeStatusEnum.pending);
 
         if (userOrderPayment != null) {
             // 拉起原有的支付
@@ -528,8 +535,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         //构建汇付统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-        Payment payment = new Payment(openType,
-                PaymentClientEnum.valueOf(payReq.getPaymentClient()), payReq.getPayChannel());
+        Payment payment = new Payment(openType, PaymentClientEnum.valueOf(payReq.getPaymentClient()),
+                                      payReq.getPayChannel());
         payment.setPaymentNo(generateOrderSn(detail));
         payment.setOrderNo(payReq.getOrderNo());
         payment.setOrderTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
@@ -539,7 +546,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         List<OrderDetil> orderDetails = new ArrayList<>();
         for (OmsOrderItem orderDetailVo : detail.getOrderItemList()) {
             orderDetails.add(new OrderDetil(orderDetailVo.getId().toString(), orderDetailVo.getProductName(),
-                    orderDetailVo.getProductQuantity(), orderDetailVo.getRealAmount().toString()));
+                                            orderDetailVo.getProductQuantity(),
+                                            orderDetailVo.getRealAmount().toString()));
         }
         payment.setOrderDetils(orderDetails);
         payment.setPayAmt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
@@ -572,13 +580,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             cancelOrder(detail.getId(), executePayment.getMsg(), null);
             throw new BizException(executePayment.getMsg());
         }
-        if (!executePayment.getData().getPayAmt().equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
+        if (!executePayment.getData()
+                           .getPayAmt()
+                           .equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
             cancelOrder(detail.getId(), "订单金额和实际支付金额不符", null);
             throw new BizException("订单金额和实际支付金额不符");
         }
 
 
-        saveOrderPayment(executePayment.getData(), detail,payReq.getPaymentClient());
+        saveOrderPayment(executePayment.getData(), detail, payReq.getPaymentClient());
 
         if (executePayment.getStatus()) {
             orderPayRes.setPay_amt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
@@ -596,7 +606,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
 
-    private void saveOrderPayment(Payment payment, OmsOrderDetail detail,String paymentClient) {
+    private void saveOrderPayment(Payment payment, OmsOrderDetail detail, String paymentClient) {
         UserOrderPayment userOrderPayment;
         OmsOrder omsOrder = new OmsOrder();
         omsOrder.setId(detail.getId());
@@ -660,7 +670,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
         if (detail.getStatus() == 0) {
-            orderSuccess(detail, data,data.getId());
+            orderSuccess(detail, data, data.getId());
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
         }
@@ -688,7 +698,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         if (detail.getStatus() == 0) {
 
-            cancelOrder(detail.getId(), data.getErrMsg(),data);
+            cancelOrder(detail.getId(), data.getErrMsg(), data);
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", dataString);
         }
@@ -744,15 +754,17 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         try {
             Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
-                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), PayChannelEnum.valueOf(orderPayment.getPayChannel()));
+                                        PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
+                                        PayChannelEnum.valueOf(orderPayment.getPayChannel()));
             param.setId(orderPayment.getTransNo());
             param.setPaymentNo(orderPayment.getAdapayNo());
             BaseResult<Payment> res = paymentClient.queryPayment(param);
             //支付成功
-            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
-                    && (detail.getStatus() == 0 || detail.getStatus() == 1)
-            ) {
-                orderSuccess(detail,res.getData().getId());
+            if (res.getStatus() && TradeStatusEnum.succeeded.getCode()
+                                                            .equals(res.getData()
+                                                                       .getStatus()
+                                                                       .getCode()) && (detail.getStatus() == 0 || detail.getStatus() == 1)) {
+                orderSuccess(detail, res.getData().getId());
                 return;
             }
             //支付失败
@@ -769,7 +781,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
 
     void orderSuccess(OmsOrder detail, String tranId) {
-        orderSuccess(detail,null,tranId);
+        orderSuccess(detail, null, tranId);
     }
 
     /**
@@ -794,9 +806,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             }
         }
         if (orderPayment.getPayChannel().equals("alipay") || orderPayment.getPayChannel().equals("ali_app")) {
-            paySuccess(detail.getId(),1);
+            paySuccess(detail.getId(), 1);
         } else if (orderPayment.getPayChannel().equals("wx_lite") || orderPayment.getPayChannel().equals("wx_app")) {
-            paySuccess(detail.getId(),2);
+            paySuccess(detail.getId(), 2);
         }
 
         orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
@@ -881,8 +893,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         if (couponId == null) return;
         //查询第一张优惠券
         SmsCouponHistoryExample example = new SmsCouponHistoryExample();
-        example.createCriteria().andMemberIdEqualTo(memberId)
-                .andCouponIdEqualTo(couponId).andUseStatusEqualTo(useStatus == 0 ? 1 : 0);
+        example.createCriteria()
+               .andMemberIdEqualTo(memberId)
+               .andCouponIdEqualTo(couponId)
+               .andUseStatusEqualTo(useStatus == 0 ? 1 : 0);
         List<SmsCouponHistory> couponHistoryList = couponHistoryMapper.selectByExample(example);
         if (!CollectionUtils.isEmpty(couponHistoryList)) {
             SmsCouponHistory couponHistory = couponHistoryList.get(0);
@@ -896,9 +910,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         for (OmsOrderItem orderItem : orderItemList) {
             //原价-促销优惠-优惠券抵扣-积分抵扣
             BigDecimal realAmount = orderItem.getProductPrice()
-                    .subtract(orderItem.getPromotionAmount())
-                    .subtract(orderItem.getCouponAmount())
-                    .subtract(orderItem.getIntegrationAmount());
+                                             .subtract(orderItem.getPromotionAmount())
+                                             .subtract(orderItem.getCouponAmount())
+                                             .subtract(orderItem.getIntegrationAmount());
             orderItem.setRealAmount(realAmount);
         }
     }
@@ -938,7 +952,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal integrationAmount = new BigDecimal(0);
         for (OmsOrderItem orderItem : orderItemList) {
             if (orderItem.getIntegrationAmount() != null) {
-                integrationAmount = integrationAmount.add(orderItem.getIntegrationAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+                integrationAmount = integrationAmount.add(
+                        orderItem.getIntegrationAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
             }
         }
         return integrationAmount;
@@ -951,7 +966,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal couponAmount = new BigDecimal(0);
         for (OmsOrderItem orderItem : orderItemList) {
             if (orderItem.getCouponAmount() != null) {
-                couponAmount = couponAmount.add(orderItem.getCouponAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+                couponAmount = couponAmount.add(
+                        orderItem.getCouponAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
             }
         }
         return couponAmount;
@@ -964,7 +980,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal promotionAmount = new BigDecimal(0);
         for (OmsOrderItem orderItem : orderItemList) {
             if (orderItem.getPromotionAmount() != null) {
-                promotionAmount = promotionAmount.add(orderItem.getPromotionAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+                promotionAmount = promotionAmount.add(
+                        orderItem.getPromotionAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
             }
         }
         return promotionAmount;
@@ -996,8 +1013,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             return zeroAmount;
         }
         //是否超过订单抵用最高百分比
-        BigDecimal integrationAmount = new BigDecimal(useIntegration).divide(new BigDecimal(integrationConsumeSetting.getUseUnit()), 2, RoundingMode.HALF_EVEN);
-        BigDecimal maxPercent = new BigDecimal(integrationConsumeSetting.getMaxPercentPerOrder()).divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
+        BigDecimal integrationAmount = new BigDecimal(useIntegration).divide(
+                new BigDecimal(integrationConsumeSetting.getUseUnit()), 2, RoundingMode.HALF_EVEN);
+        BigDecimal maxPercent = new BigDecimal(integrationConsumeSetting.getMaxPercentPerOrder()).divide(
+                new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
         if (integrationAmount.compareTo(totalAmount.multiply(maxPercent)) > 0) {
             return zeroAmount;
         }
@@ -1017,11 +1036,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             calcPerCouponAmount(orderItemList, coupon);
         } else if (coupon.getUseType().equals(1)) {
             //指定分类
-            List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList, 0);
+            List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
+                                                                                  0);
             calcPerCouponAmount(couponOrderItemList, coupon);
         } else if (coupon.getUseType().equals(2)) {
             //指定商品
-            List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList, 1);
+            List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
+                                                                                  1);
             calcPerCouponAmount(couponOrderItemList, coupon);
         }
     }
@@ -1035,7 +1056,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal totalAmount = calcTotalAmount(orderItemList);
         for (OmsOrderItem orderItem : orderItemList) {
             //(商品价格/可用商品总价)*优惠券面额
-            BigDecimal couponAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(coupon.getAmount());
+            BigDecimal couponAmount = orderItem.getProductPrice()
+                                               .divide(totalAmount, 3, RoundingMode.HALF_EVEN)
+                                               .multiply(coupon.getAmount());
             orderItem.setCouponAmount(couponAmount);
         }
     }
@@ -1112,7 +1135,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             if (cartPromotionItem.getProductSkuId() == null) {
                 continue;
             }
-            int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(),cartPromotionItem.getQuantity());
+            int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(), cartPromotionItem.getQuantity());
             if (i == 0) {
                 Asserts.fail("库存不足");
             }
@@ -1124,15 +1147,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      */
     private void lockProductStock(List<CartPromotionItem> cartPromotionItemList) {
         Map<Long, List<CartPromotionItem>> collect = cartPromotionItemList.stream()
-                                  .collect(Collectors.groupingBy(CartPromotionItem::getProductId));
+                                                                          .collect(Collectors.groupingBy(
+                                                                                  CartPromotionItem::getProductId));
         for (Map.Entry<Long, List<CartPromotionItem>> entry : collect.entrySet()) {
             List<CartPromotionItem> value = entry.getValue();
-            if(CollectionUtils.isEmpty(value)) {
+            if (CollectionUtils.isEmpty(value)) {
                 continue;
             }
             int sum = value.stream().mapToInt(CartPromotionItem::getQuantity).sum();
-            if (sum >0 ) {
-                int i = pmsProductMapper.lockStock(entry.getKey(),sum);
+            if (sum > 0) {
+                int i = pmsProductMapper.lockStock(entry.getKey(), sum);
                 if (i == 0) {
                     Asserts.fail("库存不足");
                 }
@@ -1161,8 +1185,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal totalAmount = new BigDecimal("0");
         BigDecimal promotionAmount = new BigDecimal("0");
         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-            totalAmount = totalAmount.add(cartPromotionItem.getPrice().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
-            promotionAmount = promotionAmount.add(cartPromotionItem.getReduceAmount().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
+            totalAmount = totalAmount.add(
+                    cartPromotionItem.getPrice().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
+            promotionAmount = promotionAmount.add(
+                    cartPromotionItem.getReduceAmount().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
         }
         calcAmount.setTotalAmount(totalAmount);
         calcAmount.setPromotionAmount(promotionAmount);

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

+ 4 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/open/UserOrderClient.java → cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -1,5 +1,6 @@
-package com.yonge.cooleshow.admin.open;
+package com.yonge.cooleshow.admin.controller.open;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
@@ -83,6 +84,8 @@ public class UserOrderClient extends BaseController {
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
                 OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
                 PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+        log.info("统一解析结果:{}", JSONObject.toJSONString(res));
+
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
             //查询到订单

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

+ 6 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java

@@ -39,10 +39,12 @@ public interface SubjectDao extends BaseDAO<Long, Subject> {
      * @updateTime 2022/4/6 11:41
      * @return: int
      */
-    int deleteById(Long id);
+    int deleteById(@Param("id") Long id);
 
     //根据声部id查详情
-    Subject selectSubjectById(String lessonSubject);
-    
-    Subject queryByName(String name);
+    Subject selectSubjectById(@Param("lessonSubject") String lessonSubject);
+
+    Subject queryByCode(@Param("code") String code);
+
+    Subject queryByName(@Param("name") String name);
 }

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

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java

@@ -20,7 +20,7 @@ public class OrderPayReq {
     @ApiModelProperty(value = "订单号 ", required = true)
     private String orderNo;
     @NotNull(message = "支付渠道不能为空")
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝扫码 ali_app 支付宝APP  wx_app 微信APP wx_lite 微信小程序支付", required = true)
+    @ApiModelProperty(value = "支付渠道:  alipay 支付宝扫码(汇付) ali_app 支付宝APP(原生)  wx_app 微信APP (原生) wx_lite 微信小程序支付(汇付,暂未完成)", required = true)
     private PayChannelEnum payChannel;
     @ApiModelProperty(value = "微信用户openId(微信支付必传)",hidden = true)
     private String openId;

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -28,7 +28,7 @@ public class OrderReq {
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
     @NotNull(message = "订单类型不能为空")
-    @ApiModelProperty(value = "订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 PINAO_ROOM、琴房时长", required = true)
+    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长", required = true)
     private OrderTypeEnum orderType;
     @ApiModelProperty(value = "订单描述信息 ")
     private String orderDesc;
@@ -52,7 +52,7 @@ public class OrderReq {
         @ApiModelProperty(value = "订单详情号", hidden = true)
         private String subOrderNo;
         @NotNull(message = "商品类型不能为空")
-        @ApiModelProperty(value = "商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 PINAO_ROOM、琴房时长", required = true)
+        @ApiModelProperty(value = "商品类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播) 老师端( PINAO_ROOM、琴房时长", required = true)
         private GoodTypeEnum goodType;
         @ApiModelProperty("商品名称 ")
         private String goodName;

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

+ 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);
 
     /**
      * 查询购买直播课的订单

+ 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

+ 23 - 21
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SubjectServiceImpl.java

@@ -32,6 +32,7 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
     public List<Subject> findBySubjectByIdList(List<Long> subjectIdList) {
         return subjectDao.findBySubjectIds(subjectIdList);
     }
+
     @Override
     public List<Subject> findBySubjectByIdList(String subjectIdList) {
         return subjectDao.findBySubjectByIdList(subjectIdList);
@@ -47,26 +48,27 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
     }
 
     @Override
-	public int deleteById(Long id) {
-    	List<Subject> subjectList = subjectDao.findByParentId(id);
-    	if(subjectList != null && subjectList.size() > 0){
-			throw new BizException("该分类下已创建下级,无法删除");
-    	}
-		return subjectDao.deleteById(id);
-	}
-
-	@Override
+    public int deleteById(Long id) {
+        List<Subject> subjectList = subjectDao.findByParentId(id);
+        if (subjectList != null && subjectList.size() > 0) {
+            throw new BizException("该分类下已创建下级,无法删除");
+        }
+        return subjectDao.deleteById(id);
+    }
+
+    @Override
     public void upSetSubject(Subject subject) {
-		
-		Subject orginSubject = subjectDao.queryByName(subject.getName());
-		
-		if(orginSubject != null){
-			if(orginSubject.getId() != subject.getId()){
-				throw new BizException("名称已存在,请修改名称");
-			}
-		}
-		
-		if (subject.getId() != null) {
+        Subject subjectByCode = subjectDao.queryByCode(subject.getCode());
+        if (subjectByCode != null && subjectByCode.getId() != subject.getId()) {
+            throw new BizException("声部编码已存在,请修改编码");
+        }
+
+        Subject subjectByName = subjectDao.queryByName(subject.getName());
+        if (subjectByName != null && subjectByName.getId() != subject.getId()) {
+            throw new BizException("名称已存在,请修改名称");
+        }
+
+        if (subject.getId() != null) {
             subject.setUpdateTime(new Date());
             subjectDao.update(subject);
         } else {
@@ -79,7 +81,7 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
         List<Subject> allList = subjectDao.findAll(new HashMap<>());
 
         List<Subject> parents = allList.stream()
-                .filter(o -> (null == o.getParentSubjectId() || o.getParentSubjectId().equals(0L) ))
+                .filter(o -> (null == o.getParentSubjectId() || o.getParentSubjectId().equals(0L)))
                 .collect(Collectors.toList());
 
         List<Subject> subjects = allList.stream()
@@ -96,7 +98,7 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
                 }
                 if (subject.getParentSubjectId().equals(parent.getId())) {
                     List<Subject> children = parent.getSubjects();
-                    if(CollectionUtils.isEmpty(children)){
+                    if (CollectionUtils.isEmpty(children)) {
                         children = new ArrayList<>();
                     }
                     children.add(subject);

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

@@ -126,7 +126,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         //支付订单号生成
         Long paymentNo = idGeneratorService.generatorId("paymentNo");
 
-        //构建汇付统一下单请求
+        //构建统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
         Payment payment = new Payment(openType, payReq.getPaymentClient(), payReq.getPayChannel());
         payment.setPaymentNo(paymentNo.toString());
@@ -180,9 +180,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             userOrderService.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.PAYING.getCode());
             return HttpResponseResult.succeed(orderPayRes);
         } else {
-            //入订单付款表,同时修改订单状态
-            userOrderService.doOrderCancel(detail, OrderStatusEnum.FAIL, paymentResBaseResult.getMsg());
-            return HttpResponseResult.failed(paymentResBaseResult.getMsg());
+            //付款失败
+            throw new BizException(paymentResBaseResult.getMsg());
         }
     }
 

+ 24 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -25,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
@@ -112,7 +113,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (!OrderStatusEnum.PAID.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单状态异常");
         }
-        if (StringUtil.isEmpty(detail.getTransNo())) {
+        if (StringUtil.isEmpty(detail.getTransNo()) && StringUtil.isEmpty(detail.getPaymentNo())) {
             return HttpResponseResult.failed("未找到订单付款信息");
         }
         UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
@@ -134,19 +135,23 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             if (CollectionUtils.isNotEmpty(collect)) {
 
                 Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>> refundCreateFunction = refundCreate.get(vo.getGoodType());
-                if (Objects.isNull(refundCreateFunction)) {
+                if (!Objects.isNull(refundCreateFunction)) {
                     refundReq.setOredrDetil(vo);
                     HttpResponseResult<RefundCreateRes> apply = refundCreateFunction.apply(refundReq);
                     if (apply.getStatus()) {
                         detilIds.add(vo.getId());
-                        actualPrice.add(apply.getData().getActualPrice());
+                        actualPrice = actualPrice.add(apply.getData().getActualPrice());
                     }
                 } else {
                     detilIds.add(vo.getId());
-                    actualPrice.add(vo.getActualPrice());
+                    actualPrice = actualPrice.add(vo.getActualPrice());
                 }
             }
         }
+        if(actualPrice.doubleValue() <= 0){
+            throw new BizException("退款金额不能为0");
+        }
+
         String join = StringUtil.join(detilIds, ",");
 
         UserOrderRefund orderRefunds = new UserOrderRefund();
@@ -163,7 +168,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             List<Long> collect = refundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(collect)) {
                 Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
-                if (Objects.isNull(refundAfterConsumer)) {
+                if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }
@@ -202,7 +207,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 }
                 //调用业务方法
                 Consumer<UserOrderDetailVo> refundCancelConsumer = refundCancel.get(detail.getGoodType());
-                if (Objects.isNull(refundCancelConsumer)) {
+                if (!Objects.isNull(refundCancelConsumer)) {
                     refundCancelConsumer.accept(detail);
                 }
             }
@@ -247,16 +252,16 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             }
 
             Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>> refundCreateFunction = refundCreate.get(vo.getGoodType());
-            if (Objects.isNull(refundCreateFunction)) {
+            if (!Objects.isNull(refundCreateFunction)) {
                 orderRefundReq.setOredrDetil(vo);
                 HttpResponseResult<RefundCreateRes> apply = refundCreateFunction.apply(orderRefundReq);
                 if (apply.getStatus()) {
                     detilIds.add(vo.getId());
-                    actualPrice.add(apply.getData().getActualPrice());
+                    actualPrice = actualPrice.add(apply.getData().getActualPrice());
                 }
             } else {
                 detilIds.add(vo.getId());
-                actualPrice.add(vo.getActualPrice());
+                actualPrice = actualPrice.add(vo.getActualPrice());
             }
         }
         String join = StringUtil.join(detilIds, ",");
@@ -275,7 +280,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             List<Long> collect = orderRefundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(collect)) {
                 Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
-                if (Objects.isNull(refundAfterConsumer)) {
+                if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }
@@ -300,13 +305,19 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded)
         );
 
+        if (null == payment || !TradeStatusEnum.succeeded.equals(payment.getStatus())) {
+            throw new BizException("订单状态异常");
+        }
+
         //单号生成
         Long billNo = idGeneratorService.generatorId("billNo");
 
         RefundBill refundBill = new RefundBill(payment.getOpenType(),
                 PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
-        refundBill.setId(payment.getTransNo());
+        refundBill.setTradeNo(payment.getTransNo());
+        refundBill.setPaymentNo(payment.getPaymentNo());
         refundBill.setRefundNo(billNo.toString());
+        refundBill.setOrderAmt(payment.getPayAmt());
         refundBill.setRefundAmt(orderRefund.getActualAmount());
         refundBill.setReason(orderRefund.getReason());
 
@@ -365,7 +376,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
             for (UserOrderDetailVo vo : userOrderDetails) {
                 Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
-                if (Objects.isNull(refundAfterConsumer)) {
+                if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }
@@ -412,7 +423,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
             for (UserOrderDetailVo vo : userOrderDetails) {
                 Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
-                if (Objects.isNull(refundAfterConsumer)) {
+                if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }

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

@@ -307,7 +307,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单状态异常");
         }
-        return doOrderPay(payReq, detail);
+        try {
+            return doOrderPay(payReq, detail);
+        } catch (BizException e) {
+            //入订单付款表,同时修改订单状态
+            doOrderCancel(detail, OrderStatusEnum.FAIL, e.getMessage());
+            return HttpResponseResult.failed(e.getMessage());
+        } catch (Exception e){
+            //入订单付款表,同时修改订单状态
+            doOrderCancel(detail, OrderStatusEnum.FAIL, e.getMessage());
+            return HttpResponseResult.failed("付款失败");
+        }
     }
 
     @Override
@@ -618,8 +628,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                     if (null != data.getExecutePaymentCallBack()) {
                         orderPayment.setBackPayAmt(
                                 new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
-                        orderPayment.setFeeAmt(
-                                new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
+
+                        BigDecimal feeAmt = new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt());
+                        if (BigDecimal.ZERO.equals(feeAmt)) {
+                            orderPayment.setFeeAmt(orderPayment.getPayAmt().subtract(orderPayment.getBackPayAmt()));
+                        } else {
+                            orderPayment.setFeeAmt(feeAmt);
+                        }
                     }
                     orderPaymentService.updateById(orderPayment);
                 }

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

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

@@ -0,0 +1,206 @@
+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;
+
+/**
+ * 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;
+    }
+}

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

@@ -20,6 +20,9 @@ public class TeacherMusicSheetVo {
     @ApiModelProperty("老师昵称")
     private String username;
 
+    @ApiModelProperty("老师真实姓名")
+    private String realName;
+
     @ApiModelProperty("手机号码")
     private String phone;
 
@@ -158,4 +161,12 @@ public class TeacherMusicSheetVo {
     public void setAuditName(String auditName) {
         this.auditName = auditName;
     }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
 }

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

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml

@@ -45,6 +45,7 @@
 				count(1) as entryNum
 			from teacher t
 			<where>
+				t.entry_flag_ = 1
 				<if test="param.startTime !=null">
 					<![CDATA[AND t.entry_auth_date_ >= #{param.startTime} ]]>
 				</if>
@@ -75,6 +76,7 @@
 				count(1) as musicianNum
 			from teacher t
 			<where>
+				t.musician_flag_ = 1
 				<if test="param.startTime !=null">
 					<![CDATA[AND t.musician_date_ >= #{param.startTime} ]]>
 				</if>

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

@@ -420,6 +420,7 @@
         select
         ms.create_by_ as teacherId
         ,su.username_ as username
+        ,su.real_name_ as realName
         ,su.phone_ as phone
         ,ms.id_ as musicSheetId
         ,ms.music_sheet_name_ as musicSheetName
@@ -431,7 +432,7 @@
         ,ms.music_price_ as musicPrice
         ,ms.create_time_ as createTime
         ,ms.audit_status_ as auditStatus
-        ,su.username_ as auditName
+        ,su2.username_ as auditName
         from music_sheet ms
         left join sys_user su on su.id_ = ms.create_by_
         left join music_sheet_auth_record msar on ms.id_ = msar.music_sheet_id_
@@ -462,7 +463,7 @@
                 and ms.charge_type_ = #{param.chargeType}
             </if>
         </where>
-        order by  ms.submit_audit_time_ desc
+        order by field(ms.audit_status_,'DOING') desc,  ms.submit_audit_time_ desc
     </select>
 
     <select id="selectTeacherMusicSheetCount" resultType="java.lang.Integer">

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

@@ -129,7 +129,12 @@
             parameterType="java.lang.String">
         SELECT * FROM subject WHERE del_flag_ = 0 and id_=#{lessonSubject}
     </select>
-    
+
+    <select id="queryByCode" resultType="com.yonge.cooleshow.biz.dal.entity.Subject"
+            parameterType="java.lang.String">
+        SELECT * FROM subject WHERE del_flag_ = 0 and code_ = #{code}
+    </select>
+
     <select id="queryByName" resultType="com.yonge.cooleshow.biz.dal.entity.Subject"
             parameterType="java.lang.String">
         SELECT * FROM subject WHERE del_flag_ = 0 and name_ = #{name}

+ 8 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -68,11 +68,13 @@
     <select id="selectOrderRefundDetils" resultType="com.yonge.cooleshow.biz.dal.entity.UserOrderDetail">
         select d.* from user_order o
         left join user_order_detail d on o.order_no_ = d.order_no_
-        where o.id_ = {orderId} and o.status_ = 'PAID'
-        and not exists (
-            select 1 from user_order_refund r where r.biz_type_ = 'ORDER' and r.status_ in ('DOING','PASS') and r.biz_id_ = o.id_
-            union all
-            select 1 from user_order_refund r where r.biz_type_ = 'GOOD' and r.status_ in ('DOING','PASS') and r.biz_id_ = d.id_
-        )
+        where o.id_ = #{orderId}
+          and o.status_ = 'PAID'
+          and not exists (
+                select 1 from user_order_refund r
+                where r.order_no_ = o.order_no_
+                  and r.status_ in ('DOING','PASS')
+                  and FIND_IN_SET(d.id_,r.oredr_detil_ids_)
+            )
     </select>
 </mapper>

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

+ 44 - 39
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java

@@ -5,7 +5,6 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
 import com.yonge.cooleshow.biz.dal.support.DistributedLock;
@@ -13,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -21,65 +21,70 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/userOrderRefunds")
 @Api(value = "用户退款表", tags = "用户退款表")
 public class UserOrderRefundController extends BaseController {
-	@Autowired
-	private SysUserFeignService sysUserFeignService;
-	@Autowired
-	private RedissonClient redissonClient;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private RedissonClient redissonClient;
     @Autowired
     private UserOrderRefundService userOrderRefundService;
 
-	/**
+    /**
      * 查询单条
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
     public HttpResponseResult<UserOrderRefundVo> detail(@PathVariable("id") Long id) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null || null == user.getId()) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-    	return succeed(userOrderRefundService.detail(id));
-	}
-    
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(userOrderRefundService.detail(id));
+    }
+
     /**
      * 查询分页
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入orderRefundsSearch")
     public HttpResponseResult<PageInfo<UserOrderRefundVo>> page(@RequestBody UserOrderRefundSearch query) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null || null == user.getId()) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		query.setUserId(user.getId());
-		IPage<UserOrderRefundVo> pages = userOrderRefundService.selectPage(PageUtil.getPage(query), query);
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId());
+        IPage<UserOrderRefundVo> pages = userOrderRefundService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
-	}
+    }
 
-	@ApiOperation(value = "订单退款")
-	@PostMapping("/orderRefund")
-	public HttpResponseResult<Boolean> orderRefund(@RequestBody OrderRefundReq refundReq) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null || null == user.getId()) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		refundReq.setUserId(user.getId());
-		Future<HttpResponseResult<Boolean>> httpResponseResultFuture = DistributedLock.of(redissonClient)
-				.callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-						, () -> userOrderRefundService.orderRefund(refundReq), 60L, TimeUnit.SECONDS);
+    @ApiOperation(value = "订单退款")
+    @PostMapping("/orderRefund")
+    public HttpResponseResult<Boolean> orderRefund(@RequestBody OrderRefundReq refundReq) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        refundReq.setUserId(user.getId());
 
-		try {
-			return httpResponseResultFuture.get();
-		} catch (Exception e) {
-			e.printStackTrace();
-			return HttpResponseResult.failed("订单退款失败");
-		}
-	}
+        try {
+            HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , () -> userOrderRefundService.orderRefund(refundReq), 60L, TimeUnit.SECONDS);
+            if (null != res) {
+                return res;
+            } else {
+                return HttpResponseResult.failed("订单退款失败");
+            }
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("订单退款失败");
+        }
+    }
 }

+ 2 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/open/OpenClient.java → cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java

@@ -1,4 +1,4 @@
-package com.yonge.cooleshow.student.open;
+package com.yonge.cooleshow.student.controller.open;
 
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
@@ -19,7 +19,7 @@ import java.util.Map;
 
 @RestController
 @RequestMapping("/open")
-@Api(value = "开放权限接口")
+@Api(value = "开放权限接口", tags = "开放权限接口")
 public class OpenClient extends BaseController {
     @Autowired
     private TeacherService teacherService;

+ 0 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

@@ -23,8 +23,6 @@ public class TaskController extends BaseController {
     @Autowired
     private StudentTimeService studentTimeService;
     @Autowired
-    private UserOrderService userOrderService;
-    @Autowired
     private VipCardRecordService vipCardRecordService;
     @Autowired
     private CourseRepliedService repliedService;

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

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/open/UserWithdrawalClient.java → cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/UserWithdrawalClient.java

@@ -1,4 +1,4 @@
-package com.yonge.cooleshow.teacher.open;
+package com.yonge.cooleshow.teacher.controller.open;
 
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;

+ 5 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java

@@ -18,31 +18,31 @@ public class RefundBill extends Base {
      */
     private String id;
     /***
-     * 付款订单号
+     * 付款订单号(必填)
      * @author liweifan
      * @updateTime 2022/5/10 15:30
      */
     String paymentNo;
     /***
-     * 付款订单三方流水号
+     * 付款订单三方流水号(必填)
      * @author liweifan
      * @updateTime 2022/5/10 15:30
      */
     String tradeNo;
     /***
-     * 退款订单号
+     * 退款订单号(必填)
      * @author liweifan
      * @updateTime 2022/3/31 11:00
      */
     private String refundNo;
     /***
-     * 原订单金额
+     * 原订单金额(必填)
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
     private BigDecimal orderAmt;
     /***
-     * 退款金额,必须大于0,保留两位小数点,如0.10、100.05等
+     * 退款金额,必须大于0,保留两位小数点,如0.10、100.05等(必填)
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */

+ 3 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java

@@ -15,13 +15,13 @@ public class ExecutePaymentCallBack implements Serializable {
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
-    private String payAmt;
+    private String payAmt = "0";
     /***
-     * 服务费
+     * todo 服务费(若返回0,则取原支付金额-回调支付金额) 或者 直接按费率计算
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
-    private String feeAmt;
+    private String feeAmt = "0";
 
     /***
      * 交易时间

+ 2 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/RefundPaymentCallBack.java

@@ -18,11 +18,11 @@ public class RefundPaymentCallBack implements Serializable {
     /**
      * 退款金额(单位:元)
      */
-    private String refundAmt;
+    private String refundAmt = "0";
     /**
      * 退款手续费(单位:元)
      */
-    private String feeAmt;
+    private String feeAmt = "0";
     /***
      * 交易时间
      * @author liweifan

+ 1 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -68,6 +68,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
         request.setNotifyUrl(paymentProperties.getNotifyUrl()
                 + "/" + payment.getOpenType().getCode()
+                + "/" + payment.getPaymentClient().getCode()
                 + "/" + payment.getPayChannel().getCode()
                 + "/executePayment");
 

+ 16 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -217,10 +217,10 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
             return BaseResult.succeed(refundBill);
         } catch (WxPayException e) {
             log.error("微信APP支付请求失败:{}", e.toString());
-            return BaseResult.failed(e.toString());
+            throw new BizException(e.toString());
         } catch (Exception e) {
             e.printStackTrace();
-            return BaseResult.failed("微信APP支付关单请求失败");
+            throw new BizException("微信APP支付关单请求失败");
         }
     }
 
@@ -236,7 +236,6 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         String params = WebUtil.getBodyData(request);
         log.info("微信APP回调:{}", params);
 
-
         PaymentCallBack paymentCallBack = new PaymentCallBack();
         paymentCallBack.setMethodName(methodName);
 
@@ -264,7 +263,15 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
                 ExecutePaymentCallBack executePayment = new ExecutePaymentCallBack();
                 if (!StringUtil.isEmpty(result.getAmount().getTotal())) {
-                    executePayment.setPayAmt(new BigDecimal(result.getAmount().getTotal()).divide(new BigDecimal("100")).toString());
+
+                    BigDecimal payAmt = new BigDecimal(result.getAmount().getTotal()).divide(new BigDecimal("100"));
+                    executePayment.setPayAmt(payAmt.toString());
+
+                    String WX_FEE_RATE = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_FEE_RATE).getParamValue();
+
+                    BigDecimal feeRate = new BigDecimal(StringUtil.isEmpty(WX_FEE_RATE) ? "0.006" : WX_FEE_RATE);
+
+                    executePayment.setFeeAmt(payAmt.multiply(feeRate).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
                 }
                 if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();
@@ -293,7 +300,11 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 RefundPaymentCallBack refundPayment = new RefundPaymentCallBack();
                 refundPayment.setBillNo(result.getOutRefundNo());
                 refundPayment.setTransNo(result.getRefundId());
-                refundPayment.setRefundAmt(result.getAmount().getRefund());
+                refundPayment.setRefundAmt(
+                        new BigDecimal(result.getAmount().getRefund())
+                                .divide(new BigDecimal("100"))
+                                .toString()
+                );
 
                 if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();

+ 7 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

@@ -48,4 +48,11 @@ public interface WxpayConstant {
      * @updateTime 2022/5/13 14:09
      */
     String WX_PRIVATE_KEY_PATH = "WX_PRIVATE_KEY_PATH";
+    /***
+     * 微信-手续费率
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_FEE_RATE = "WX_FEE_RATE";
+
 }