瀏覽代碼

fix:merge

liujunchi 3 年之前
父節點
當前提交
1942f2cd67
共有 58 個文件被更改,包括 928 次插入867 次删除
  1. 1 2
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  2. 0 36
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PlatformEnum.java
  3. 9 6
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  4. 13 10
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  5. 29 27
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  6. 4 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  7. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java
  8. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  9. 0 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleTeacherTimeDao.java
  10. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java
  11. 19 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundDao.java
  12. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  13. 0 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MyCourseSearch.java
  14. 116 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserOrderRefundSearch.java
  15. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudent.java
  16. 0 126
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherTime.java
  17. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBindingTeacher.java
  18. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  19. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  20. 0 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleTeacherTimeService.java
  21. 9 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  22. 149 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  23. 0 196
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleTeacherTimeServiceImpl.java
  24. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  25. 23 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  26. 8 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  27. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudentVo.java
  28. 28 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java
  29. 8 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  30. 0 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherTimeMapper.xml
  31. 12 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml
  32. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  33. 19 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  34. 9 5
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  35. 2 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  36. 10 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  37. 0 63
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleTeacherTimeController.java
  38. 24 17
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  39. 0 110
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java
  40. 2 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  41. 3 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java
  42. 32 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PaymentClientEnum.java
  43. 15 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Base.java
  44. 4 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  45. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/OpenAuth.java
  46. 4 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java
  47. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java
  48. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/entity/SysConfigPayment.java
  49. 6 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java
  50. 23 10
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/SysConfigPaymentService.java
  51. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java
  52. 14 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/SysConfigPaymentServiceImpl.java
  53. 35 24
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  54. 24 8
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java
  55. 67 36
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  56. 35 43
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java
  57. 14 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java
  58. 12 0
      toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

+ 1 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -124,10 +124,9 @@ public class TokenController extends BaseController {
 		return succeed(objectMapper.readValue(resp.getBody(), Map.class));
 	}
 
-	@PostMapping(value = "exit",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	@GetMapping(value = "exit")
 	@ApiOperation(value = "退出登录")
 	public HttpResponseResult<String> logout(HttpServletRequest request) {
-		
 		String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
 		if (StringUtils.isBlank(authHeader)) {
 			return failed("退出失败,token 为空");

+ 0 - 36
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PlatformEnum.java

@@ -1,36 +0,0 @@
-package com.yonge.cooleshow.common.enums;
-
-import com.yonge.toolset.base.enums.BaseEnum;
-
-/**
- * Description
- *
- * @author liujunchi
- * @date 2022-04-24
- */
-public enum PlatformEnum implements BaseEnum<String,PlatformEnum> {
-
-    STUDENT("STUDENT","STUDENT"),
-    TEACHER("TEACHER","TEACHER");
-
-    private String code;
-    private String msg;
-
-    PlatformEnum(String code,String msg) {
-        this.code = code;
-        this.msg = msg;
-    }
-
-    @Override
-    public String getCode() {
-        return this.code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-}

+ 9 - 6
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -18,6 +18,7 @@ import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.core.service.PaymentClient;
@@ -61,7 +62,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
 
     @Override
     public List<OmsOrderReturnApply> list(OmsReturnApplyQueryParam queryParam, Integer pageSize, Integer pageNum) {
-        PageHelper.startPage(pageNum,pageSize);
+        PageHelper.startPage(pageNum, pageSize);
         return returnApplyDao.getList(queryParam);
     }
 
@@ -80,7 +81,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             return 1;
         }
         OmsOrderReturnApply returnApply = new OmsOrderReturnApply();
-        if(status.equals(1)){
+        if (status.equals(1)) {
             //确认退货
             returnApply.setId(id);
             returnApply.setStatus(1);
@@ -89,7 +90,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             returnApply.setHandleTime(new Date());
             returnApply.setHandleMan(statusParam.getHandleMan());
             returnApply.setHandleNote(statusParam.getHandleNote());
-        }else if(status.equals(2)){
+        } else if (status.equals(2)) {
             //完成退货
             returnApply.setId(id);
             returnApply.setStatus(2);
@@ -97,14 +98,14 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             returnApply.setReceiveMan(statusParam.getReceiveMan());
             returnApply.setReceiveNote(statusParam.getReceiveNote());
             refundAmount(omsOrderReturnApply);
-        }else if(status.equals(3)){
+        } else if (status.equals(3)) {
             //拒绝退货
             returnApply.setId(id);
             returnApply.setStatus(3);
             returnApply.setHandleTime(new Date());
             returnApply.setHandleMan(statusParam.getHandleMan());
             returnApply.setHandleNote(statusParam.getHandleNote());
-        }else{
+        } else {
             return 0;
         }
         return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
@@ -122,7 +123,9 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             throw new ApiException("未找到付款信息");
         }
         String orderSn = generateOrderSn(returnApply);
-        RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
+
+        RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()),
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
         refundReq.setRefundNo(orderSn);
         refundReq.setRefundAmt(returnApply.getReturnAmount().setScale(2, RoundingMode.HALF_UP));
 

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

@@ -19,6 +19,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -97,12 +98,12 @@ public class PaymentController extends BaseController {
                 }
             }
             return failed("请求超时");
-        }catch (BizException e) {
+        } catch (BizException e) {
             return failed(e.getMessage());
         } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");
-        }finally {
+        } finally {
             lock.unlock();
         }
     }
@@ -114,7 +115,8 @@ public class PaymentController extends BaseController {
         if (null == userOrderPayment) {
             return HttpResponseResult.succeed();
         }
-        Payment param = new Payment(OpenEnum.valueOf(userOrderPayment.getOpenType()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
+        Payment param = new Payment(OpenEnum.valueOf(userOrderPayment.getOpenType()),
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
         param.setId(userOrderPayment.getTransNo());
         param.setPaymentNo(userOrderPayment.getTransNo());
         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
@@ -140,25 +142,27 @@ public class PaymentController extends BaseController {
      * @param: request
      * @updateTime 2022/3/11 18:35
      */
-    @PostMapping("/callback/{openType}/{payChannel}/{payMethod}")
+    @PostMapping("/callback/{openType}/{client}/{payChannel}/{payMethod}")
     public Object callback(
             @PathVariable("openType") String openType,
+            @PathVariable("client") String client,
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
     ) {
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
-                OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
-        if(res.getStatus()){
+                OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
+                PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+        if (res.getStatus()) {
             PaymentCallBack data = res.getData();
 
-            if(MethodNameEnum.executePayment.equals(data.getMethodName())){
+            if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
                 //支付交易
                 orderService.executePaymentCallBack(data);
-            }else if(MethodNameEnum.closePayment.equals(data.getMethodName())){
+            } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
                 //关闭订单
                 orderService.closePaymentCallBack(data);
-            }else if(MethodNameEnum.refundPayment.equals(data.getMethodName())){
+            } else if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
                 //退款
                 portalOrderReturnApplyService.refundPaymentCallBack(data);
             }
@@ -167,7 +171,6 @@ public class PaymentController extends BaseController {
     }
 
 
-
     // private Object wxAppCallbackHandle(String payMethod, HttpServletRequest request) throws Exception {
     //     String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
     //     String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();

+ 29 - 27
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -21,6 +21,7 @@ import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
 import com.yonge.cooleshow.portal.dao.SmsCouponHistoryDao;
 import com.yonge.cooleshow.portal.domain.*;
 import com.yonge.cooleshow.portal.service.*;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.utils.string.StringUtil;
 
 import com.yonge.toolset.base.result.BaseResult;
@@ -78,7 +79,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private SmsCouponHistoryMapper couponHistoryMapper;
     @Autowired
     private RedisService redisService;
-    private String REDIS_KEY_ORDER_ID= "redis.key.orderId";
+    private String REDIS_KEY_ORDER_ID = "redis.key.orderId";
     private String REDIS_DATABASE = "redis.database";
     @Autowired
     private PortalOrderDao portalOrderDao;
@@ -110,7 +111,7 @@ 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();
@@ -135,7 +136,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         //获取购物车及优惠信息
         UmsMember currentMember = memberService.getCurrentMember();
         List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), orderParam.getCartIds(),
-                                                                                      true);
+                true);
         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
             //生成下单商品信息
             OmsOrderItem orderItem = new OmsOrderItem();
@@ -176,7 +177,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             handleCouponAmount(orderItemList, couponHistoryDetail);
         }
         //判断是否使用积分
-        if (orderParam.getUseIntegration() == null||orderParam.getUseIntegration().equals(0)) {
+        if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
             //不使用积分
             for (OmsOrderItem orderItem : orderItemList) {
                 orderItem.setIntegrationAmount(new BigDecimal(0));
@@ -261,7 +262,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setOrderSn(generateOrderSn(order));
         //设置自动收货天数
         List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
-        if(CollUtil.isNotEmpty(orderSettings)){
+        if (CollUtil.isNotEmpty(orderSettings)) {
             order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
         }
         //插入order表和order_item表
@@ -334,11 +335,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Override
     public Integer cancelTimeOutOrder() {
-        Integer count=0;
+        Integer count = 0;
         OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
         //查询超时、未支付的订单及订单详情
         List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime()
-                ,orderSetting.getPayOrderOvertime());
+                , orderSetting.getPayOrderOvertime());
         if (CollectionUtils.isEmpty(timeOutOrders)) {
             return count;
         }
@@ -363,7 +364,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             return;
         }
         OmsOrder cancelOrder = cancelOrderList.get(0);
-        if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6) ) {
+        if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
             //修改订单状态为取消
             cancelOrder.setStatus(4);
             orderMapper.updateByPrimaryKeySelective(cancelOrder);
@@ -400,10 +401,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     public void confirmReceiveOrder(Long orderId) {
         UmsMember member = memberService.getCurrentMember();
         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
-        if(!member.getId().equals(order.getMemberId())){
+        if (!member.getId().equals(order.getMemberId())) {
             Asserts.fail("不能确认他人订单!");
         }
-        if(order.getStatus()!=2){
+        if (order.getStatus() != 2) {
             Asserts.fail("该订单还未发货!");
         }
         order.setStatus(3);
@@ -414,16 +415,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Override
     public CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize) {
-        if(status.equals("-1")){
+        if (status.equals("-1")) {
             status = null;
         }
         UmsMember member = memberService.getCurrentMember();
-        PageHelper.startPage(pageNum,pageSize);
+        PageHelper.startPage(pageNum, pageSize);
         OmsOrderExample orderExample = new OmsOrderExample();
         OmsOrderExample.Criteria criteria = orderExample.createCriteria();
         criteria.andDeleteStatusEqualTo(0)
                 .andMemberIdEqualTo(member.getId());
-        if(status != null && !StringUtil.isEmpty(status)) {
+        if (status != null && !StringUtil.isEmpty(status)) {
             List<Long> list = StringUtil.toLongList(status);
             List<Integer> collect = list.stream().map(Long::intValue).collect(Collectors.toList());
             criteria.andStatusIn(collect);
@@ -437,7 +438,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         resultPage.setPageSize(orderPage.getPageSize());
         resultPage.setTotal(orderPage.getTotal());
         resultPage.setTotalPage(orderPage.getTotalPage());
-        if(CollUtil.isEmpty(orderList)){
+        if (CollUtil.isEmpty(orderList)) {
             return resultPage;
         }
         //设置数据信息
@@ -448,7 +449,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         List<OmsOrderDetail> orderDetailList = new ArrayList<>();
         for (OmsOrder omsOrder : orderList) {
             OmsOrderDetail orderDetail = new OmsOrderDetail();
-            BeanUtil.copyProperties(omsOrder,orderDetail);
+            BeanUtil.copyProperties(omsOrder, orderDetail);
             List<OmsOrderItem> relatedItemList = orderItemList.stream().filter(item -> item.getOrderId().equals(orderDetail.getId())).collect(Collectors.toList());
             orderDetail.setOrderItemList(relatedItemList);
             orderDetailList.add(orderDetail);
@@ -464,7 +465,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         example.createCriteria().andOrderIdEqualTo(orderId);
         List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
         OmsOrderDetail orderDetail = new OmsOrderDetail();
-        BeanUtil.copyProperties(omsOrder,orderDetail);
+        BeanUtil.copyProperties(omsOrder, orderDetail);
         orderDetail.setOrderItemList(orderItemList);
         return orderDetail;
     }
@@ -483,7 +484,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         example.createCriteria().andOrderIdEqualTo(omsOrder.getId());
         List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
         OmsOrderDetail orderDetail = new OmsOrderDetail();
-        BeanUtil.copyProperties(omsOrder,orderDetail);
+        BeanUtil.copyProperties(omsOrder, orderDetail);
         orderDetail.setOrderItemList(orderItemList);
         return orderDetail;
     }
@@ -492,13 +493,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     public void deleteOrder(Long orderId) {
         UmsMember member = memberService.getCurrentMember();
         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
-        if(!member.getId().equals(order.getMemberId())){
+        if (!member.getId().equals(order.getMemberId())) {
             Asserts.fail("不能删除他人订单!");
         }
-        if(order.getStatus()==3||order.getStatus()==4){
+        if (order.getStatus() == 3 || order.getStatus() == 4) {
             order.setDeleteStatus(1);
             orderMapper.updateByPrimaryKey(order);
-        }else{
+        } else {
             Asserts.fail("只能删除已完成或已关闭的订单!");
         }
     }
@@ -532,7 +533,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         //构建汇付统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-        Payment payment = new Payment(openType, payReq.getPayChannel());
+        Payment payment = new Payment(openType,
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), payReq.getPayChannel());
         payment.setPaymentNo(generateOrderSn(detail));
         payment.setOrderNo(payReq.getOrderNo());
         payment.setOrderTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
@@ -542,7 +544,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         List<OrderDetil> orderDetils = new ArrayList<>();
         for (OmsOrderItem orderDetailVo : detail.getOrderItemList()) {
             orderDetils.add(new OrderDetil(orderDetailVo.getId().toString(), orderDetailVo.getProductName(),
-                       orderDetailVo.getProductQuantity(), orderDetailVo.getRealAmount().toString()));
+                    orderDetailVo.getProductQuantity(), orderDetailVo.getRealAmount().toString()));
         }
         payment.setOrderDetils(orderDetils);
         payment.setPayAmt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
@@ -634,7 +636,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
 
-
     /***
      * 处理回调-支付成功
      * @author liweifan
@@ -679,7 +680,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
             cancelOrder(detail.getId(), data.getErrMsg(),data);
         } else {
-            log.error("汇付支付回调,订单状态异常。 req is {}",JSON.toJSONString(data));
+            log.error("汇付支付回调,订单状态异常。 req is {}", JSON.toJSONString(data));
         }
     }
 
@@ -732,7 +733,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         try {
-            Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()), PayChannelEnum.valueOf(orderPayment.getPayChannel()));
+            Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
+                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), PayChannelEnum.valueOf(orderPayment.getPayChannel()));
             param.setId(orderPayment.getTransNo());
             param.setPaymentNo(orderPayment.getAdapayNo());
             BaseResult<Payment> res = paymentClient.queryPayment(param);
@@ -811,7 +813,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private String generateOrderSn(OmsOrder order) {
         StringBuilder sb = new StringBuilder();
         String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
-        String key = REDIS_DATABASE+":"+ REDIS_KEY_ORDER_ID + date;
+        String key = REDIS_DATABASE + ":" + REDIS_KEY_ORDER_ID + date;
         Long increment = redisService.incr(key, 1);
         sb.append(date);
         sb.append(String.format("%02d", order.getSourceType()));
@@ -1134,7 +1136,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      */
     private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) {
         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-            if (cartPromotionItem.getRealStock()==null||cartPromotionItem.getRealStock() <= 0) {
+            if (cartPromotionItem.getRealStock() == null || cartPromotionItem.getRealStock() <= 0) {
                 return false;
             }
         }

+ 4 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -54,7 +55,7 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     @Override
     public UserOrderPayment getByOrderNo(String orderSn, PayChannelEnum payChannel, TradeStatusEnum payStatus) {
 
-        return userOrderPaymentMapper.selectByOrderNoAndStatus(orderSn,payChannel.getCode(),payStatus.getCode());
+        return userOrderPaymentMapper.selectByOrderNoAndStatus(orderSn, payChannel.getCode(), payStatus.getCode());
     }
 
     @Override
@@ -76,7 +77,8 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
             //发送支付关单请求
             if (!StringUtil.isEmpty(orderPayment.getTransNo())) {
                 ClosePayment closePayment = new ClosePayment(OpenEnum.valueOf(orderPayment.getOpenType()),
-                                                              PayChannelEnum.valueOf(orderPayment.getPayChannel()));
+                        PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
+                        PayChannelEnum.valueOf(orderPayment.getPayChannel()));
                 closePayment.setId(orderPayment.getTransNo());
                 closePayment.setReason(message);
                 closePayment.setPaymentNo(orderPayment.getAdapayNo());

+ 2 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -54,7 +55,7 @@ public class UserOrderRefundController extends BaseController {
 	@PostMapping("/doAuth")
 	@ApiOperation(value = "审核", notes = "传入authOperaReq")
 	@PreAuthorize("@pcs.hasPermissions('userOrderRefunds/doAuth')")
-	public HttpResponseResult<RefundBill> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
+	public HttpResponseResult<UserOrderRefundBill> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (user == null || null == user.getId()) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -211,13 +211,21 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     //查询老师声部价格
     BigDecimal selectPrice(@Param("teacherId") Long teacherId, @Param("subjectId") Long subjectId);
 
+    //查询课程
     List<CourseSchedule> selectSchedule(Integer courseId);
 
-    void updateStartTime();
+    //更新课程状态
+    void updateStartTime(List<Long> list);
 
+    //更新课程状态
     void updateEndTime();
 
+    //根据日期查课程id
     List<Long> selectIdList(String day);
 
+    //更新老师课酬
     void updateTeacherSalary(List<Long> list);
+
+    //查询课程id(开课时间 ≤ NOW ≤ 结束时间)
+    List<Long> selectUpStartIds();
 }

+ 0 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleTeacherTimeDao.java

@@ -1,12 +0,0 @@
-package com.yonge.cooleshow.biz.dal.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherTime;
-
-/**
- * @Author: cy
- * @Date: 2022/5/26
- */
-public interface CourseScheduleTeacherTimeDao extends BaseMapper<CourseScheduleTeacherTime> {
-
-}

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

@@ -14,6 +14,6 @@ import java.util.Map;
  * @Date: 2022/5/26
  */
 public interface UserBindingTeacherDao extends BaseMapper<UserBindingTeacher> {
-    //我的学员
-    IPage<CourseStudentVo> myStudent(Page<CourseStudentVo> pageInfo,@Param("param") Map<String, Object> param);
+    //查询学员
+    IPage<CourseStudentVo> selectStudent(Page<CourseStudentVo> pageInfo,@Param("param") Map<String, Object> param);
 }

+ 19 - 16
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundDao.java

@@ -11,28 +11,31 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
 
 
-public interface UserOrderRefundDao extends BaseMapper<UserOrderRefund>{
-	/**
-	 * 查询详情
+public interface UserOrderRefundDao extends BaseMapper<UserOrderRefund> {
+    /**
+     * 查询详情
+     *
      * @author liweifan
      * @date 2022-05-09 17:14:30
      * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo
-	 */
-	UserOrderRefundVo detail(@Param("id") Long id);
+     */
+    UserOrderRefundVo detail(@Param("id") Long id, @Param("userId") Long userId);
 
-	/**
-	 * 分页查询
+    /**
+     * 分页查询
+     *
      * @author liweifan
      * @date 2022-05-09 17:14:30
      * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo
-	 */
-	List<UserOrderRefundVo> selectPage(@Param("page") IPage page, @Param("param") UserOrderRefundSearch userOrderRefund);
-	/***
-	 * 查询订单中,未退费的商品
-	 * @author liweifan
-	 * @param: bizId
-	 * @updateTime 2022/5/9 18:05
-	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrderDetail>
-	 */
+     */
+    List<UserOrderRefundVo> selectPage(@Param("page") IPage page, @Param("param") UserOrderRefundSearch userOrderRefund);
+
+    /***
+     * 查询订单中,未退费的商品
+     * @author liweifan
+     * @param: bizId
+     * @updateTime 2022/5/9 18:05
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrderDetail>
+     */
     List<UserOrderDetail> selectOrderRefundDetils(@Param("orderId") Long orderId);
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -32,6 +33,8 @@ public class OrderPayReq {
     private Long userId;
     @ApiModelProperty(value = "用户ip ",hidden = true)
     private String ipAddress;
+    @ApiModelProperty(value = "付款客户端 ",hidden = true)
+    private PaymentClientEnum paymentClient;
 
     public String getOrderNo() {
         return orderNo;
@@ -88,4 +91,12 @@ public class OrderPayReq {
     public void setBuyerId(String buyerId) {
         this.buyerId = buyerId;
     }
+
+    public PaymentClientEnum getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(PaymentClientEnum paymentClient) {
+        this.paymentClient = paymentClient;
+    }
 }

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

@@ -36,9 +36,6 @@ public class MyCourseSearch extends QueryInfo {
     @ApiModelProperty(value = "评价学员id")
     private List<Long> repliedIds;
 
-    @ApiModelProperty(value = "评价课程id")
-    private List<Long> classIds;
-
     @ApiModelProperty(value = "学生姓名")
     private String studentName;
 
@@ -48,14 +45,6 @@ public class MyCourseSearch extends QueryInfo {
     @ApiModelProperty(value = "结束时间")
     private String endDate;
 
-    public List<Long> getClassIds() {
-        return classIds;
-    }
-
-    public void setClassIds(List<Long> classIds) {
-        this.classIds = classIds;
-    }
-
     public String getStartDate() {
         return startDate;
     }

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

@@ -1,7 +1,17 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
 import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
 
 /**
  * @Author: liweifan
@@ -9,6 +19,111 @@ import io.swagger.annotations.ApiModel;
  */
 @ApiModel(value = "UserOrderRefundSearch对象", description = "退款申请表查询对象")
 public class UserOrderRefundSearch extends QueryInfo {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "时间类型不能为空")
+    @ApiModelProperty("时间类型 MONTH、月度  YEAR、年度")
+    private PeriodEnum timeType;
+
+    @ApiModelProperty("时间 yyyy | yyyy-MM")
+    private String dateTime;
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    /***
+     * 开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(hidden = true)
+    private LocalDateTime startTime;
+    /***
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(hidden = true)
+    private LocalDateTime endTime;
+
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public PeriodEnum getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(PeriodEnum timeType) {
+        this.timeType = timeType;
+    }
+
+    public String getDateTime() {
+        return dateTime;
+    }
+
+    public void setDateTime(String dateTime) {
+        this.dateTime = dateTime;
+    }
+
+    public LocalDateTime getStartTime() {
+        if (null == startTime) {
+            LocalDateTime firstDay;
+            if (PeriodEnum.YEAR.equals(timeType)) {
+                LocalDate paramDate;
+                if (StringUtil.isEmpty(dateTime)) {
+                    paramDate = LocalDate.now();
+                } else {
+                    paramDate = LocalDate.of(Integer.parseInt(dateTime), 1, 1);
+                }
+                firstDay = LocalDateTime.of(paramDate.with(TemporalAdjusters.firstDayOfYear()), LocalTime.MIN);
+            } else {
+                LocalDate paramDate;
+                if (StringUtil.isEmpty(dateTime)) {
+                    paramDate = LocalDate.now();
+                } else {
+                    String[] classDateSp = dateTime.split("-");
+                    paramDate = LocalDate.of(Integer.parseInt(classDateSp[0]), Integer.parseInt(classDateSp[1]), 1);
+                }
+                firstDay = LocalDateTime.of(paramDate.with(TemporalAdjusters.firstDayOfMonth()), LocalTime.MIN);
+            }
+            return firstDay;
+        }
+        return startTime;
+    }
+
+    public void setStartTime(LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public LocalDateTime getEndTime() {
+        if (null == endTime) {
+            LocalDateTime lastDay;
+            if (PeriodEnum.YEAR.equals(timeType)) {
+                LocalDate paramDate;
+                if (StringUtil.isEmpty(dateTime)) {
+                    paramDate = LocalDate.now();
+                } else {
+                    paramDate = LocalDate.of(Integer.parseInt(dateTime), 1, 1);
+                }
+                lastDay = LocalDateTime.of(paramDate.with(TemporalAdjusters.lastDayOfYear()), LocalTime.MAX);
+            } else {
+                LocalDate paramDate;
+                if (StringUtil.isEmpty(dateTime)) {
+                    paramDate = LocalDate.now();
+                } else {
+                    String[] classDateSp = dateTime.split("-");
+                    paramDate = LocalDate.of(Integer.parseInt(classDateSp[0]), Integer.parseInt(classDateSp[1]), 1);
+                }
+                lastDay = LocalDateTime.of(paramDate.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
+            }
+            return lastDay;
+        }
+        return endTime;
+    }
 
+    public void setEndTime(LocalDateTime endTime) {
+        this.endTime = endTime;
+    }
 }

+ 54 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudent.java

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/26
+ */
+@ApiModel
+public class CourseScheduleStudent implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("course_id_")
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @TableField("student_id_")
+    @ApiModelProperty(value = "学生id")
+    private String studentId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(String studentId) {
+        this.studentId = studentId;
+    }
+}
+

+ 0 - 126
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleTeacherTime.java

@@ -1,126 +0,0 @@
-package com.yonge.cooleshow.biz.dal.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @Author: cy
- * @Date: 2022/5/26
- */
-@ApiModel
-public class CourseScheduleTeacherTime implements Serializable {
-    @TableId(value = "id_", type = IdType.AUTO)
-    @ApiModelProperty(value = "主键")
-    private Long id;
-
-    @TableField("course_group_id_")
-    @ApiModelProperty(value = "课程组id")
-    private Long courseGroupId;
-
-    @TableField("course_schedule_id_")
-    @ApiModelProperty(value = "课程id")
-    private Long courseScheduleId;
-
-    @TableField("teacher_id_")
-    @ApiModelProperty(value = "老师id")
-    private Long teacherId;
-
-    @TableField("student_id_list_")
-    @ApiModelProperty(value = "学生id集合")
-    private String studentIdList;
-
-    @TableField("class_num_")
-    @ApiModelProperty(value = "课堂编号-第几堂课")
-    private Integer classNum;
-
-    @TableField("consume_time_")
-    @ApiModelProperty(value = "消耗时长(分钟)")
-    private Long consumeTime;
-
-    @TableField("created_time_")
-    @ApiModelProperty(value = "创建时间")
-    private Date createdTime;
-
-    @TableField("update_time_")
-    @ApiModelProperty(value = "更新时间")
-    private Date updateTime;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public Long getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public String getStudentIdList() {
-        return studentIdList;
-    }
-
-    public void setStudentIdList(String studentIdList) {
-        this.studentIdList = studentIdList;
-    }
-
-    public Integer getClassNum() {
-        return classNum;
-    }
-
-    public void setClassNum(Integer classNum) {
-        this.classNum = classNum;
-    }
-
-    public Long getConsumeTime() {
-        return consumeTime;
-    }
-
-    public void setConsumeTime(Long consumeTime) {
-        this.consumeTime = consumeTime;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-}
-

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

@@ -27,6 +27,10 @@ public class UserBindingTeacher implements Serializable {
     @ApiModelProperty(value = "学生id")
     private Long studentId;
 
+    @TableField("last_end_class_")
+    @ApiModelProperty(value = "最近结课日期")
+    private Date lastEndClass;
+
     @TableField("created_time_")
     @ApiModelProperty(value = "创建时间")
     private Date createdTime;
@@ -35,6 +39,14 @@ public class UserBindingTeacher implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updateTime;
 
+    public Date getLastEndClass() {
+        return lastEndClass;
+    }
+
+    public void setLastEndClass(Date lastEndClass) {
+        this.lastEndClass = lastEndClass;
+    }
+
     public Long getId() {
         return id;
     }

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -28,7 +28,10 @@ public class UserOrderPayment implements Serializable {
     @ApiModelProperty("服务提供方: ORIGINAL 微信支付宝 ADAPAY 汇付")
     @TableField(value = "open_type_")
     private OpenEnum openType;
-    @ApiModelProperty("支付渠道:  alipay 支付宝  wx_lite 微信 ")
+    @ApiModelProperty("服务提供方: STUDENT 微信支付宝 TEACHER 汇付")
+    @TableField(value = "payment_client_")
+    private String paymentClient;
+    @ApiModelProperty("支付渠道: alipay 支付宝  wx_lite 微信 ")
     @TableField(value = "pay_channel_")
     private PayChannelEnum payChannel;
     @ApiModelProperty("订单号 ")
@@ -215,4 +218,12 @@ public class UserOrderPayment implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public String getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(String paymentClient) {
+        this.paymentClient = paymentClient;
+    }
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -238,5 +238,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     void scheduleTask();
 
     void teacherSalaryTask();
+
+    PinaoRoomTimeVo selectRemainTime(Long teacherId);
 }
 

+ 0 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleTeacherTimeService.java

@@ -1,23 +0,0 @@
-package com.yonge.cooleshow.biz.dal.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherTime;
-import com.yonge.cooleshow.biz.dal.vo.ArrangeCourseVo;
-import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
-import com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo;
-import com.yonge.toolset.base.page.PageInfo;
-
-import java.util.Map;
-
-/**
- * @Author: cy
- * @Date: 2022/5/26
- */
-public interface CourseScheduleTeacherTimeService extends IService<CourseScheduleTeacherTime> {
-    PinaoRoomTimeVo selectRemainTime(Long teacherId);
-
-    PageInfo<CourseStudentVo> myStudent(Map<String, Object> param);
-
-    void arrangeCourse(ArrangeCourseVo arrangeCourseVo);
-}
-

+ 9 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 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.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.RefundBill;
@@ -24,7 +25,12 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
  	 * @date 2022-03-30
      */
 	UserOrderRefundVo detail(Long id);
-
+	/**
+	 * 查询详情
+	 * @author liweifan
+	 * @date 2022-03-30
+	 */
+	UserOrderRefundVo detail(Long id,Long userId);
     /**
      * 分页查询
      * @author liweifan
@@ -47,7 +53,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @updateTime 2022/5/9 16:25
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
-    HttpResponseResult<RefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user);
+    HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user);
 
 	/**
 	 * 系統自動退款
@@ -55,7 +61,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @param reason
 	 * @return
 	 */
-	HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason);
+	HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason);
 
 	/**
 	 * 退款回调

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

@@ -94,6 +94,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private SysMessageService sysMessageService;
     @Autowired
     private HolidaysFestivalsDao holidaysFestivalsDao;
+    @Autowired
+    private PinaoRoomTimeDao pinaoRoomTimeDao;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -652,8 +654,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     public IPage<MyCourseVo> queryTeacherPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search) {
         //查询所有已评价学生id
         List<Long> studentList = repliedDao.selectAll();
-        //查询所有已评价课程id
-        List<Long> classList = repliedDao.selectAllClass();
 
         Integer replied = search.getReplied();
         if (replied != null) {
@@ -663,7 +663,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     search.setRepliedIds(null);
                 } else {
                     search.setRepliedIds(studentList);
-                    search.setClassIds(classList);
                 }
             }
 
@@ -1486,7 +1485,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      */
     @Transactional(rollbackFor = Exception.class)
     public void scheduleTask() {
-        baseMapper.updateStartTime();
+        //查询课程id(开课时间 ≤ NOW ≤ 结束时间)
+        List<Long> startIds=baseMapper.selectUpStartIds();
+        if (CollectionUtils.isNotEmpty(startIds)){
+            baseMapper.updateStartTime(startIds);
+        }
         baseMapper.updateEndTime();
     }
 
@@ -1506,4 +1509,146 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //更新老师课酬表
         baseMapper.updateTeacherSalary(idList);
     }
+
+    public PinaoRoomTimeVo selectRemainTime(Long teacherId) {
+        return pinaoRoomTimeDao.selectRemainTime(teacherId);
+    }
+
+//    public PageInfo<CourseStudentVo> selectStudent(Map<String, Object> param) {
+//        Integer courseId = (Integer) param.get("courseId");
+//        if (courseId != null) {
+//            CourseScheduleStudent teacherTime = baseMapper.selectOne(Wrappers.<CourseScheduleStudent>lambdaQuery().eq(CourseScheduleStudent::getCourseScheduleId, courseId));
+//            if (teacherTime == null) {
+//                throw new BizException("未查到课程");
+//            }
+//            String studentIdList = teacherTime.getStudentIdList();
+//            List<String> idList = Arrays.asList(studentIdList.split(","));
+//            param.put("idList", idList);//根据课程id查询报课学员
+//        }
+//        return PageUtil.pageInfo(userBindingTeacherDao.selectStudent(PageUtil.getPageInfo(param), param));
+//    }
+//
+//    public void arrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
+//        DistributedLock.of(redissonClient)
+//                .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + teacherId)
+//                        , () -> this.checkArrangeCourse(arrangeCourseVo, teacherId), 60L, TimeUnit.SECONDS);
+//    }
+//
+//    @Transactional(rollbackFor = Exception.class)
+//    public void checkArrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
+//        Integer classNum = arrangeCourseVo.getClassNum();//课时数
+//        Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
+//        List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
+//        Integer consumTime = classNum * singleClssTime * studentIds.size();//消耗时长
+//        List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
+//        Integer consumeTime = arrangeCourseVo.getConsumeTime();
+//
+//        //校验课时
+//        if (timeList.size() != classNum) {
+//            throw new BizException("课时数与排课数不符");
+//        }
+//
+//        //校验消耗时长
+//        if (!consumTime.equals(consumeTime)) {
+//            throw new BizException("时长计算错误");
+//        }
+//
+//        //校验上下课时间
+//        for (int i = 1; i <= timeList.size(); i++) {
+//            if (!DateUtil.offsetMinute(timeList.get(i).getStartTime(), singleClssTime).equals(timeList.get(i).getEndTime())) {
+//                throw new BizException("第{}节课结束时间计算错误", i);
+//            }
+//        }
+//
+//        //校验时长
+//        PinaoRoomTime pinaoRoomTime = pinaoRoomTimeDao.selectOne(Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId, teacherId));
+//        if (pinaoRoomTime == null) {
+//            throw new BizException("未查询到老师剩余时长");
+//        }
+//        Long remainTime = pinaoRoomTime.getRemainTime();
+//        Long frozenTime = pinaoRoomTime.getFrozenTime();
+//        if (consumTime > remainTime) {
+//            throw new BizException("剩余时长不足");
+//        }
+//
+//        //校验学员是否绑定
+//        List<UserBindingTeacher> bindingTeachers = userBindingTeacherDao.selectList(Wrappers.<UserBindingTeacher>lambdaQuery().eq(UserBindingTeacher::getTeacherId, teacherId));
+//        if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(bindingTeachers)) {
+//            throw new BizException("无绑定学员");
+//        }
+//        List<Long> studentList = bindingTeachers.stream().map(UserBindingTeacher::getStudentId).collect(Collectors.toList());
+//        for (Long studentId : studentIds) {
+//            if (!studentList.contains(studentId)) {
+//                throw new BizException("学员id:{},未绑定", studentId);
+//            }
+//        }
+//
+//        //校验传入时间是否交集
+//        if (timeList.size() > 1) {
+//            for (int i = 0; i < timeList.size(); i++) {
+//                if (i == timeList.size() - 1) {
+//                    break;
+//                }
+//                CourseTimeEntity o = timeList.get(i);
+//                List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
+//                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
+//                if (checkParamTime) {
+//                    throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
+//                }
+//            }
+//        }
+//
+//        //批量检查老师课时在数据库是否重复
+//        groupService.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+//
+//        //校验购买的课程组每节课时间是否和自己的课时冲突
+//        for (Long studentId : studentIds) {
+//            groupService.batchCheckStudentCourseTime(studentId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+//        }
+//
+//        //添加课程组
+//        CourseGroup courseGroup = new CourseGroup();
+//        courseGroup.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+//        courseGroup.setTeacherId(teacherId);
+//        courseGroup.setName(arrangeCourseVo.getCourseName());
+//        courseGroup.setSubjectId(arrangeCourseVo.getSubjectId());
+//        courseGroup.setSingleCourseMinutes(singleClssTime);
+//        courseGroup.setCourseNum(classNum);
+//        courseGroup.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+//        courseGroup.setCreatedBy(teacherId);
+//        courseGroupDao.insert(courseGroup);
+//
+//        for (int i = 0; i < timeList.size(); i++) {
+//            //添加课程
+//            CourseTimeEntity courseTimeEntity = timeList.get(i);
+//            CourseSchedule schedule = new CourseSchedule();
+//            schedule.setCourseGroupId(courseGroup.getId());
+//            schedule.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+//            schedule.classNum(i + 1);
+//            schedule.setTeacherId(teacherId);
+//            schedule.setClassDate(DateUtil.trunc(courseTimeEntity.getStartTime()));
+//            schedule.setStartTime(courseTimeEntity.getStartTime());
+//            schedule.setEndTime(courseTimeEntity.getEndTime());
+//            schedule.setLock(0);
+//            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
+//            schedule.setCreatedBy(teacherId);
+//            courseScheduleDao.insert(schedule);
+//
+//            //添加course_schedule_teacher_time
+//            CourseScheduleStudent teacherTime = new CourseScheduleStudent();
+//            teacherTime.setCourseGroupId(courseGroup.getId());
+//            teacherTime.setCourseScheduleId(schedule.getId());
+//            teacherTime.setTeacherId(teacherId);
+//            teacherTime.setStudentIdList(org.apache.commons.lang.StringUtils.join(studentIds, ","));
+//            teacherTime.setClassNum(i + 1);
+//            teacherTime.setConsumeTime(Long.valueOf(singleClssTime));
+//            baseMapper.insert(teacherTime);
+//        }
+//
+//        //扣减pinao_room_time
+//        PinaoRoomTime roomTime = new PinaoRoomTime();
+//        roomTime.setRemainTime(remainTime - consumTime);
+//        roomTime.setFrozenTime(frozenTime + consumTime);
+//        pinaoRoomTimeDao.update(roomTime, Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId, teacherId));
+//    }
 }

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

@@ -1,196 +0,0 @@
-package com.yonge.cooleshow.biz.dal.service.impl;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dao.*;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
-import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherTimeService;
-import com.yonge.cooleshow.biz.dal.support.PageUtil;
-import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
-import com.yonge.cooleshow.biz.dal.vo.*;
-import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.page.PageInfo;
-import com.yonge.toolset.utils.date.DateUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @Author: cy
- * @Date: 2022/5/26
- */
-@Service("courseScheduleTeacherTimeService")
-public class CourseScheduleTeacherTimeServiceImpl extends ServiceImpl<CourseScheduleTeacherTimeDao, CourseScheduleTeacherTime> implements CourseScheduleTeacherTimeService {
-    private final static Logger log = LoggerFactory.getLogger(CourseScheduleTeacherTimeServiceImpl.class);
-
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private PinaoRoomTimeDao pinaoRoomTimeDao;
-    @Autowired
-    private UserBindingTeacherDao userBindingTeacherDao;
-    @Autowired
-    private CourseScheduleService courseScheduleService;
-    @Autowired
-    private CourseGroupServiceImpl groupService;
-    @Autowired
-    private CourseGroupDao courseGroupDao;
-    @Autowired
-    private CourseScheduleDao courseScheduleDao;
-
-    /**
-     * @Description: 查询琴房剩余时长、冻结时长、统计学员人数
-     * @Author: cy
-     * @Date: 2022/5/26
-     */
-    @Override
-    public PinaoRoomTimeVo selectRemainTime(Long teacherId) {
-        return pinaoRoomTimeDao.selectRemainTime(teacherId);
-    }
-
-    /**
-     * @Description: 我的学员
-     * @Author: cy
-     * @Date: 2022/5/26
-     */
-    @Override
-    public PageInfo<CourseStudentVo> myStudent(Map<String, Object> param) {
-        Page<CourseStudentVo> pageInfo = PageUtil.getPageInfo(param);
-        IPage<CourseStudentVo> page = userBindingTeacherDao.myStudent(pageInfo, param);
-        return PageUtil.pageInfo(page);
-    }
-
-    /**
-     * @Description: 排课
-     * @Author: cy
-     * @Date: 2022/5/26
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void arrangeCourse(ArrangeCourseVo arrangeCourseVo) {
-        Integer classNum = arrangeCourseVo.getClassNum();//课时数
-        Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
-        List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
-        Integer consumTime = classNum * singleClssTime * studentIds.size();//消耗时长
-        List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
-        Integer consumeTime = arrangeCourseVo.getConsumeTime();
-        SysUser user = sysUserFeignService.queryUserInfo();
-        Long teacherId = user.getId();
-
-        //校验课时
-        if (timeList.size() != classNum) {
-            throw new BizException("课时数与排课数不符");
-        }
-
-        //校验消耗时长
-        if (!consumTime.equals(consumeTime)){
-            throw new BizException("时长计算错误");
-        }
-
-        //校验时长
-        PinaoRoomTime pinaoRoomTime = pinaoRoomTimeDao.selectOne(Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId, teacherId));
-        if (pinaoRoomTime == null) {
-            throw new BizException("未查询到老师剩余时长");
-        }
-        Long remainTime = pinaoRoomTime.getRemainTime();
-        Long frozenTime = pinaoRoomTime.getFrozenTime();
-        if (consumTime > remainTime) {
-            throw new BizException("剩余时长不足");
-        }
-
-        //校验学员是否绑定
-        List<UserBindingTeacher> bindingTeachers = userBindingTeacherDao.selectList(Wrappers.<UserBindingTeacher>lambdaQuery().eq(UserBindingTeacher::getTeacherId, teacherId));
-        if (CollectionUtils.isEmpty(bindingTeachers)) {
-            throw new BizException("无绑定学员");
-        }
-        List<Long> studentList = bindingTeachers.stream().map(UserBindingTeacher::getStudentId).collect(Collectors.toList());
-        for (Long studentId : studentIds) {
-            if (!studentList.contains(studentId)) {
-                throw new BizException("学员id:{},未绑定", studentId);
-            }
-        }
-
-        //校验传入时间是否交集
-        if (timeList.size() > 1) {
-            for (int i = 0; i < timeList.size(); i++) {
-                if (i == timeList.size() - 1) {
-                    break;
-                }
-                CourseTimeEntity o = timeList.get(i);
-                List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
-                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
-                if (checkParamTime) {
-                    throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
-                }
-            }
-        }
-
-        //批量检查老师课时在数据库是否重复
-        groupService.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
-
-        //校验购买的课程组每节课时间是否和自己的课时冲突
-        for (Long studentId : studentIds) {
-            groupService.batchCheckStudentCourseTime(studentId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
-        }
-
-        //添加课程组
-        CourseGroup courseGroup = new CourseGroup();
-        courseGroup.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
-        courseGroup.setTeacherId(teacherId);
-        courseGroup.setName(arrangeCourseVo.getCourseName());
-        courseGroup.setSubjectId(arrangeCourseVo.getSubjectId());
-        courseGroup.setSingleCourseMinutes(singleClssTime);
-        courseGroup.setCourseNum(classNum);
-        courseGroup.setStatus(CourseGroupEnum.NOT_SALE.getCode());
-        courseGroup.setCreatedBy(teacherId);
-        courseGroupDao.insert(courseGroup);
-
-        for (int i = 0; i < timeList.size(); i++) {
-            //添加课程
-            CourseTimeEntity courseTimeEntity = timeList.get(i);
-            CourseSchedule schedule = new CourseSchedule();
-            schedule.setCourseGroupId(courseGroup.getId());
-            schedule.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
-            schedule.classNum(i + 1);
-            schedule.setTeacherId(teacherId);
-            schedule.setClassDate(DateUtil.trunc(courseTimeEntity.getStartTime()));
-            schedule.setStartTime(courseTimeEntity.getStartTime());
-            schedule.setEndTime(courseTimeEntity.getEndTime());
-            schedule.setLock(0);
-            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
-            schedule.setCreatedBy(teacherId);
-            courseScheduleDao.insert(schedule);
-
-            //添加course_schedule_teacher_time
-            CourseScheduleTeacherTime teacherTime = new CourseScheduleTeacherTime();
-            teacherTime.setCourseGroupId(courseGroup.getId());
-            teacherTime.setCourseScheduleId(schedule.getId());
-            teacherTime.setTeacherId(teacherId);
-            teacherTime.setStudentIdList(studentIds.toString());
-            teacherTime.setClassNum(i + 1);
-            teacherTime.setConsumeTime(Long.valueOf(singleClssTime));
-            baseMapper.insert(teacherTime);
-        }
-
-        //扣减pinao_room_time
-        PinaoRoomTime roomTime = new PinaoRoomTime();
-        roomTime.setRemainTime(remainTime - consumTime);
-        roomTime.setFrozenTime(frozenTime + consumTime);
-        pinaoRoomTimeDao.update(roomTime,Wrappers.<PinaoRoomTime>lambdaQuery().eq(PinaoRoomTime::getTeacherId,teacherId));
-    }
-}

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

@@ -15,6 +15,7 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -94,7 +95,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         //发送支付关单请求
         if (!StringUtil.isEmpty(orderPayment.getTransNo())
                 || !StringUtil.isEmpty(orderPayment.getPaymentNo())) {
-            ClosePayment param = new ClosePayment(orderPayment.getOpenType(), orderPayment.getPayChannel());
+            ClosePayment param = new ClosePayment(orderPayment.getOpenType(),
+                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), orderPayment.getPayChannel());
             param.setId(orderPayment.getTransNo());
             param.setPaymentNo(orderPayment.getPaymentNo());
             param.setReason(reason);
@@ -127,7 +129,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
 
         //构建汇付统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-        Payment payment = new Payment(openType, payReq.getPayChannel());
+        Payment payment = new Payment(openType, payReq.getPaymentClient(), payReq.getPayChannel());
         payment.setPaymentNo(paymentNo.toString());
         payment.setOrderNo(payReq.getOrderNo());
         payment.setOrderTitle(detail.getOrderName());
@@ -223,6 +225,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     private UserOrderPayment insertOrderPayment(Payment payment) {
         UserOrderPayment orderPayment = new UserOrderPayment();
         orderPayment.setOpenType(payment.getOpenType());
+        orderPayment.setPaymentClient(payment.getPaymentClient().getCode());
         orderPayment.setPayChannel(payment.getPayChannel());
         orderPayment.setOrderNo(payment.getOrderNo());
         orderPayment.setPaymentNo(payment.getPaymentNo());

+ 23 - 9
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.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -81,7 +82,13 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
     @Override
     public UserOrderRefundVo detail(Long id) {
-        UserOrderRefundVo detail = baseMapper.detail(id);
+        UserOrderRefundVo detail = baseMapper.detail(id, null);
+        return detail;
+    }
+
+    @Override
+    public UserOrderRefundVo detail(Long id, Long userId) {
+        UserOrderRefundVo detail = baseMapper.detail(id, userId);
         return detail;
     }
 
@@ -161,7 +168,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<RefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user) {
+    public HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user) {
         UserOrderRefund orderRefund = baseMapper.selectById(authOperaReq.getId());
         if (!AuthStatusEnum.DOING.equals(orderRefund.getStatus())) {
             return HttpResponseResult.failed("退款单已审核");
@@ -200,7 +207,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
 
     @Transactional
-    public HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason) {
+    public HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason) {
         UserOrderVo detail = orderService.detail(orderNo, null);
 
         if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
@@ -210,7 +217,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             return HttpResponseResult.failed("订单状态异常");
         }
 
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(
+                detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
             return HttpResponseResult.failed("订单付款状态异常");
         }
@@ -281,7 +289,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
-    private HttpResponseResult<RefundBill> doOrderRefund(UserOrderRefund orderRefund) {
+    private HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())
                 .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded)
@@ -290,7 +298,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         //单号生成
         Long billNo = idGeneratorService.generatorId("billNo");
 
-        RefundBill refundBill = new RefundBill(payment.getOpenType(), payment.getPayChannel());
+        RefundBill refundBill = new RefundBill(payment.getOpenType(),
+                PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
         refundBill.setId(payment.getTransNo());
         refundBill.setRefundNo(billNo.toString());
         refundBill.setRefundAmt(orderRefund.getActualAmount());
@@ -302,13 +311,18 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
         orderRefundBill.setRefundId(orderRefund.getId());
         orderRefundBill.setBillNo(billNo.toString());
+        orderRefundBill.setRefundAmt(orderRefund.getActualAmount());
         if (refundBillBaseResult.getStatus()) {
             orderRefundBill.setTransNo(refundBillBaseResult.getData().getId());
+            orderRefundBill.setStatus(TradeStatusEnum.pending);
+        } else {
+            orderRefundBill.setStatus(TradeStatusEnum.failed);
+            orderRefundBill.setPayFailMsg(refundBillBaseResult.getMsg());
         }
-        orderRefundBill.setRefundAmt(orderRefund.getActualAmount());
-        orderRefundBill.setStatus(TradeStatusEnum.pending);
         refundBillService.save(orderRefundBill);
-        return HttpResponseResult.status(refundBillBaseResult);
+
+
+        return HttpResponseResult.succeed(orderRefundBill);
     }
 
     /***

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

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -182,20 +183,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单已关闭");
         }
-
-        if (!StringUtil.isEmpty(detail.getTransNo())) {
-            Payment param = new Payment(detail.getOpenType(), detail.getPayChannel());
-            param.setId(detail.getTransNo());
-            param.setPaymentNo(detail.getPaymentNo());
-            BaseResult<Payment> res = paymentClient.queryPayment(param);
-            //支付成功
-            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())) {
-                orderSuccess(detail);
-                return HttpResponseResult.failed("订单已经交易完成");
-            }
-            //关闭订单付款单
-            orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
-        }
+        orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(),"用户取消订单");
         //关闭订单
         doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         return HttpResponseResult.succeed(true);
@@ -364,8 +352,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return;
         }
-        if (!StringUtil.isEmpty(detail.getTransNo())) {
-            Payment param = new Payment(detail.getOpenType(), detail.getPayChannel());
+        UserOrderPayment userOrderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
+        if (null != userOrderPayment && TradeStatusEnum.pending.equals(userOrderPayment.getStatus())) {
+            Payment param = new Payment(detail.getOpenType(),
+                    PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), detail.getPayChannel());
             param.setId(detail.getTransNo());
             param.setPaymentNo(detail.getPaymentNo());
             BaseResult<Payment> res = paymentClient.queryPayment(param);
@@ -384,7 +374,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     private HttpResponseResult<OrderPayRes> doOrderPay(OrderPayReq payReq, UserOrderVo detail) throws Exception {
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo(), payReq.getPayChannel(), TradeStatusEnum.pending);
+        /*UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo(), payReq.getPayChannel(), TradeStatusEnum.pending);
         //当前渠道已经有创建支付请求
         if (null != orderPayment && !StringUtil.isEmpty(orderPayment.getPayInfo())) {
             OrderPayRes orderPayRes = new OrderPayRes();
@@ -393,7 +383,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayRes.setPayChannel(orderPayment.getPayChannel());
             orderPayRes.setPaymentNo(orderPayment.getPaymentNo());
             return HttpResponseResult.succeed(orderPayRes);
-        }
+        }*/
         return orderPaymentService.createOrderPayment(payReq, detail);
     }
 

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudentVo.java

@@ -23,6 +23,16 @@ public class CourseStudentVo implements Serializable {
     private String subjectName;
     @ApiModelProperty("手机号")
     private String phone;
+    @ApiModelProperty("最近结课日期(天)")
+    private Integer lastEndClass;
+
+    public Integer getLastEndClass() {
+        return lastEndClass;
+    }
+
+    public void setLastEndClass(Integer lastEndClass) {
+        this.lastEndClass = lastEndClass;
+    }
 
     public String getUserId() {
         return userId;

+ 28 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java

@@ -1,7 +1,10 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.beanutils.BeanUtils;
 
 /**
@@ -11,7 +14,31 @@ import org.apache.commons.beanutils.BeanUtils;
 @ApiModel(value = "UserOrderRefundVo对象", description = "退款申请表查询视图对象")
 public class UserOrderRefundVo extends UserOrderRefund{
 	private static final long serialVersionUID = 1L;
-    
+
+    @ApiModelProperty("订单名称 ")
+    @TableField(value = "order_name_")
+    private String orderName;
+
+    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @TableField(value = "order_type_")
+    private OrderTypeEnum orderType;
+
+    public String getOrderName() {
+        return orderName;
+    }
+
+    public void setOrderName(String orderName) {
+        this.orderName = orderName;
+    }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
+
     public UserOrderRefundVo buildVo(UserOrderRefund userOrderRefund){
         try {
             BeanUtils.copyProperties(this,userOrderRefund);

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

@@ -212,12 +212,6 @@
                 #{repliedIds}
             </foreach>
         </if>
-        <if test="param.classIds !=null and param.classIds.size>0">
-            AND p.course_id_ IN
-            <foreach collection="param.classIds" item="classIds" open="(" close=")" separator=",">
-                #{classIds}
-            </foreach>
-        </if>
         <if test="param.studentName !=null and param.studentName !=''">
             AND u.username_ LIKE CONCAT('%', #{param.studentName}, '%')
         </if>
@@ -798,8 +792,15 @@
     <select id="selectIdList" resultType="java.lang.Long">
         SELECT id_ FROM course_schedule WHERE lock_=0 AND class_date_ &lt;= #{day}
     </select>
+    <select id="selectUpStartIds" resultType="java.lang.Long">
+        SELECT id_ FROM course_schedule WHERE lock_=0
+        AND status_='NOT_START' AND start_time_ &lt;= NOW() AND NOW() &lt;= end_time_
+    </select>
     <update id="updateStartTime">
-        UPDATE course_schedule SET status_='ING' WHERE status_ != 'CANCEL' <![CDATA[ AND start_time_ <= NOW() ]]> <![CDATA[ AND NOW() <= end_time_ ]]>
+        UPDATE course_schedule SET status_='ING' WHERE id_ IN(
+        <foreach collection="list" item="item" index="index" open="" close="" separator=",">
+            #{item}
+        </foreach>)
     </update>
     <update id="updateEndTime">
         UPDATE course_schedule SET status_='COMPLETE' WHERE status_ != 'CANCEL' <![CDATA[ AND end_time_ <= NOW() ]]>

+ 0 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleTeacherTimeMapper.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.yonge.cooleshow.biz.dal.dao.CourseScheduleTeacherTimeDao">
-
-</mapper>

+ 12 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

@@ -2,14 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao">
 
-    <select id="myStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudentVo">
+    <select id="selectStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudentVo">
         SELECT
         su.id_ AS userId,
         su.username_ AS userName,
         su.real_name_ AS realName,
         su.avatar_ AS avatar,
         su.phone_ AS phone,
-        (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName
+        (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName,
+        IFNULL(TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()),TIMESTAMPDIFF(DAY,b.created_time_,NOW())) AS lastEndClass
         FROM user_binding_teacher b
         LEFT JOIN sys_user su ON b.student_id_=su.id_
         LEFT JOIN student s ON b.student_id_=s.user_id_
@@ -17,9 +18,18 @@
             <if test="param.subjectId != null">
                 find_in_set(#{param.subjectId},s.subject_id_)
             </if>
+            <if test="param.teacherId !=null">
+                AND b.teacher_id_ = #{param.teacherId}
+            </if>
             <if test="param.userName !=null and param.userName !=''">
                 AND su.username_ LIKE CONCAT('%', #{param.userName}, '%')
             </if>
+            <if test="param.idList !=null and param.idList.size>0">
+                AND su.id_ IN
+                <foreach collection="param.idList" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
         </where>
     </select>
 </mapper>

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

@@ -3,6 +3,11 @@
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao">
     <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrderPayment">
         <result column="id_" property="id" />
+
+        <result column="open_type_" property="openType" />
+        <result column="payment_client_" property="paymentClient" />
+        <result column="pay_channel_" property="payChannel" />
+
         <result column="order_no_" property="orderNo" />
         <result column="payment_no_" property="paymentNo" />
         <result column="trans_no_" property="transNo" />
@@ -23,6 +28,9 @@
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ as id
+        , t.open_type_ as openType,
+        , t.payment_client_ as paymentClient,
+        , t.pay_channel_ as payChannel,
         , t.order_no_ as orderNo
         , t.payment_no_ as paymentNo
         , t.trans_no_ as transNo

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

@@ -39,12 +39,30 @@
         <include refid="baseColumns"/>
         FROM user_order_refund t
         where t.id_ = #{id}
+        <if test="userId != null">
+            and t.user_id_ = #{userId}
+        </if>
     </select>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo">
         SELECT
-        <include refid="baseColumns" />
+            <include refid="baseColumns" />,
+            o.order_name_ as orderName,
+            o.order_type_ as orderType
         FROM user_order_refund t
+        left join user_order o on t.order_no_ = o.order_no_
+        <where>
+            <if test="param.userId !=null">
+                AND t.user_id_ = #{param.userId}
+            </if>
+            <if test="param.startTime !=null">
+                <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
+            </if>
+            <if test="param.endTime !=null">
+                <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
+            </if>
+        </where>
+        order by t.create_time_ desc
     </select>
 
     <select id="selectOrderRefundDetils" resultType="com.yonge.cooleshow.biz.dal.entity.UserOrderDetail">

+ 9 - 5
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -24,6 +24,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -79,7 +80,8 @@ public class PaymentController extends BaseController {
         if (null == userOrderPayment) {
             return HttpResponseResult.succeed();
         }
-        Payment param = new Payment(userOrderPayment.getOpenType(), userOrderPayment.getPayChannel());
+        Payment param = new Payment(userOrderPayment.getOpenType(),
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), userOrderPayment.getPayChannel());
         param.setId(userOrderPayment.getTransNo());
         param.setPaymentNo(userOrderPayment.getPaymentNo());
         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
@@ -105,21 +107,23 @@ public class PaymentController extends BaseController {
      * @param: request
      * @updateTime 2022/3/11 18:35
      */
-    @PostMapping("/callback/{openType}/{payChannel}/{payMethod}")
+    @PostMapping("/callback/{openType}/{client}/{payChannel}/{payMethod}")
     public Object callback(
             @PathVariable("openType") String openType,
+            @PathVariable("client") String client,
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
     ) {
-        log.info("支付回调:openType is {} ,payChannel is {},payMethod is {}", openType, payChannel, payMethod);
+        log.info("支付回调:openType is {} ,paymentClient is {},payChannel is {},payMethod is {}", openType, client, payChannel, payMethod);
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
-                OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+                OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
+                PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
             //查询到订单
             UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
-            if(null == userOrderVo){
+            if (null == userOrderVo) {
                 return res.getData().getResMsg();
             }
             try {

+ 2 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -19,6 +19,7 @@ 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 com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import com.yonge.toolset.utils.web.WebUtil;
@@ -92,6 +93,7 @@ public class UserOrderController extends BaseController {
         if (StringUtil.isEmpty(payReq.getOrderNo())) {
             return failed("订单号不能为空");
         }
+        payReq.setPaymentClient(PaymentClientEnum.STUDENT);
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 

+ 10 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java

@@ -25,7 +25,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 @RestController
-@RequestMapping("/UserOrderRefunds")
+@RequestMapping("/userOrderRefunds")
 @Api(value = "用户退款表", tags = "用户退款表")
 public class UserOrderRefundController extends BaseController {
 	@Autowired
@@ -41,6 +41,10 @@ public class UserOrderRefundController extends BaseController {
     @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));
 	}
     
@@ -50,6 +54,11 @@ public class UserOrderRefundController extends BaseController {
     @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);
         return succeed(PageUtil.pageInfo(pages));
 	}

+ 0 - 63
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleTeacherTimeController.java

@@ -1,63 +0,0 @@
-package com.yonge.cooleshow.teacher.controller;
-
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherTimeService;
-import com.yonge.cooleshow.biz.dal.vo.ArrangeCourseVo;
-import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
-import com.yonge.cooleshow.biz.dal.vo.PinaoRoomTimeVo;
-import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.toolset.base.page.PageInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- * @Author: cy
- * @Date: 2022/5/26
- */
-@Api("琴房")
-@RestController
-@RequestMapping("/pinaoRoom")
-public class CourseScheduleTeacherTimeController extends BaseController {
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private CourseScheduleTeacherTimeService courseScheduleTeacherTimeService;
-
-    @ApiOperation("查询琴房剩余时长、冻结时长、统计学员人数")
-    @GetMapping("/selectRemainTime")
-    public HttpResponseResult<PinaoRoomTimeVo> selectRemainTime() {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null || null == user.getId()) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-        return succeed(courseScheduleTeacherTimeService.selectRemainTime(user.getId()));
-    }
-
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "subjectId", dataType = "Long", value = "声部id"),
-            @ApiImplicitParam(name = "userName", dataType = "String", value = "学员姓名"),
-    })
-    @ApiOperation("我的学员")
-    @PostMapping("/myStudent")
-    public HttpResponseResult<PageInfo<CourseStudentVo>> myStudent(@RequestBody Map<String, Object> param) {
-        return succeed(courseScheduleTeacherTimeService.myStudent(param));
-    }
-
-    @ApiOperation("排课")
-    @PostMapping("/arrangeCourse")
-    public HttpResponseResult<Object> arrangeCourse(@RequestBody ArrangeCourseVo arrangeCourseVo){
-        courseScheduleTeacherTimeService.arrangeCourse(arrangeCourseVo);
-        return succeed();
-    }
-}
-

+ 24 - 17
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -7,10 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
-import com.yonge.cooleshow.biz.dal.vo.CourseAdjustVo;
-import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
-import com.yonge.cooleshow.biz.dal.vo.StudentHomePage;
-import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -86,16 +83,16 @@ public class TeacherCourseScheduleController extends BaseController {
 
     @ApiOperation(value = "陪练课查询",
             notes = "老师端-首页-我的课程-陪练课\n" +
-            "search:{\"classMonth\":\"2022-03\",\"status\":\"COMPLETE\",\"subjectId\":1}\n" +
-            "老师端-首页-课后评价\n" +
-            "search:{\"classMonth\":\"2022-03\",\"replied\":0,\"studentName\":\"测试王\"}\n" +
-            "老师端-我的-我的主页\n" +
-            "search:{\"classMonth\":\"2022-03\"}\n" +
-            "老师端-课表\n" +
-            "search:{\"classDate\":\"2022-03-27\"}\n" +
-            "     search:{\"classMonth\":\"2022-03\"}\n" +
-            "老师端-课表-陪练课\n" +
-            "     search:{\"classDate\":\"2022-03-27\"}")
+                    "search:{\"classMonth\":\"2022-03\",\"status\":\"COMPLETE\",\"subjectId\":1}\n" +
+                    "老师端-首页-课后评价\n" +
+                    "search:{\"classMonth\":\"2022-03\",\"replied\":0,\"studentName\":\"测试王\"}\n" +
+                    "老师端-我的-我的主页\n" +
+                    "search:{\"classMonth\":\"2022-03\"}\n" +
+                    "老师端-课表\n" +
+                    "search:{\"classDate\":\"2022-03-27\"}\n" +
+                    "     search:{\"classMonth\":\"2022-03\"}\n" +
+                    "老师端-课表-陪练课\n" +
+                    "     search:{\"classDate\":\"2022-03-27\"}")
     @PostMapping("/queryTeacherPracticeCourse")
     public HttpResponseResult<PageInfo<MyCourseVo>> queryTeacherPracticeCourse(@RequestBody MyCourseSearch search) {
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -118,9 +115,9 @@ public class TeacherCourseScheduleController extends BaseController {
         return succeed(courseScheduleService.queryCourseSchedule(search));
     }
 
-    @ApiOperation(value = "老师端-课表-日历-用户",notes = "search:{\"classDate\":\"2022-03-27\"}")
+    @ApiOperation(value = "老师端-课表-日历-用户", notes = "search:{\"classDate\":\"2022-03-27\"}")
     @PostMapping("/queryCourseUser")
-    public HttpResponseResult<Map<String,Object>> queryCourseUser(@RequestBody MyCourseSearch search) {
+    public HttpResponseResult<Map<String, Object>> queryCourseUser(@RequestBody MyCourseSearch search) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -136,7 +133,7 @@ public class TeacherCourseScheduleController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        courseScheduleService.courseAdjust(adjustVo,user.getId());
+        courseScheduleService.courseAdjust(adjustVo, user.getId());
         return succeed();
     }
 
@@ -161,5 +158,15 @@ public class TeacherCourseScheduleController extends BaseController {
     public HttpResponseResult<Object> test(Integer amount) {
         return succeed(courseScheduleService.getTeacherId(amount));
     }
+
+    @ApiOperation("查询琴房剩余时长、冻结时长、统计学员人数")
+    @GetMapping("/selectRemainTime")
+    public HttpResponseResult<PinaoRoomTimeVo> selectRemainTime() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseScheduleService.selectRemainTime(user.getId()));
+    }
 }
 

+ 0 - 110
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java

@@ -1,110 +0,0 @@
-//package com.yonge.cooleshow.teacher.controller;
-//
-//import com.alibaba.fastjson.JSONObject;
-//import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
-//import com.yonge.cooleshow.biz.dal.service.LingXinService;
-//import com.yonge.cooleshow.biz.dal.service.UserWithdrawalCallbackService;
-//import com.yonge.cooleshow.common.controller.BaseController;
-//import com.yonge.toolset.thirdparty.lingxinpay.RSA;
-//import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
-//import com.yonge.toolset.utils.json.JsonUtil;
-//import io.swagger.annotations.Api;
-//import org.apache.commons.lang3.StringUtils;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.web.bind.annotation.*;
-//
-//import javax.servlet.http.HttpServletRequest;
-//import java.util.Map;
-//import java.util.UUID;
-//
-///**
-// * @Description: 提现回调
-// * @Author: cy
-// * @Date: 2022/5/9
-// */
-//@RestController
-//@RequestMapping("/withdraw")
-//@Api(value = "提现回调", tags = "提现回调")
-//public class WithdrawController extends BaseController {
-//    private final static Logger log = LoggerFactory.getLogger(WithdrawController.class);
-//
-//    @Value("${withdraw.privateKey}")
-//    private String privateKey;//商户自己生成的私钥
-//
-//    @Autowired
-//    private UserWithdrawalCallbackService callbackService;
-//    @Autowired
-//    private LingXinService lingXinService;
-//
-//    /**
-//     * 异步回调接收
-//     *
-//     * @param content
-//     * @param request
-//     * @return
-//     */
-//    @PostMapping("/callback")
-//    public String test(@RequestBody String content, HttpServletRequest request) {
-//        System.out.println(privateKey);
-//        log.info("交易回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
-//        try {
-//            if (StringUtils.isBlank(content)) {
-//                throw new Exception();
-//            }
-//            Map<String, Object> map = JSONObject.parseObject(content);
-//            String jsonStr = RSA.decryptPri((String) map.get("sign"), privateKey);
-//            log.info("jsonStr:{}", jsonStr);
-//
-//            Map<String, Object> withdrawRecord = JSONObject.parseObject(jsonStr);
-//            UserWithdrawalCallback callback = JsonUtil.toJavaObject(withdrawRecord, UserWithdrawalCallback.class);
-//            callbackService.insertCallback(callback);
-//        } catch (Exception e) {
-//            log.error("解密失败e:{}", e);
-//            return "failed";
-//        }
-//        return "success";
-//    }
-//
-//    @PostMapping("/contractCallback")
-//    public String contractCallback(@RequestBody String content, HttpServletRequest request) {
-//        log.info("回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
-//        try {
-//            System.out.println("===成功===");
-//        } catch (Exception e) {
-//            System.out.println("===失败===");
-//            return "failed";
-//        }
-//        return "success";
-//    }
-//
-//    /**
-//     * 提现测试接口
-//     * @param remark
-//     * @return
-//     */
-//    @GetMapping("/test")
-//    public String a(String remark) {
-//        WithdrawSdk withdraw = new WithdrawSdk();
-//        //输入商户订单号
-//        String outerOrderNo = UUID.randomUUID().toString().substring(0, 12);
-//        System.out.println("商户订单号:" + outerOrderNo);
-//        //输入收款人手机号
-//        String name = "何亮";
-//        //输入收款人姓名
-//        String mobile = "17600220933";
-//        //输入收款人身份证号
-//        String certificateNo = "130423199206192818";
-//        //输入转账金额(单位分)
-//        Integer predictAmount = 1;
-//        //输入收款人账号
-//        String payAccount = "6228480018864836772";
-//
-//        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount,
-//                payAccount, remark);
-//        log.info("单笔请求返回参数:{}", requestParam);
-//        return requestParam;
-//    }
-//}

+ 2 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java

@@ -8,10 +8,7 @@ import com.huifu.adapay.model.Refund;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.adapay.constant.AdapayConstant;
 import com.yonge.toolset.payment.base.PaymentTemplate;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -179,7 +176,7 @@ public class AdapayTemplate implements PaymentTemplate {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         PaymentCallBack paymentCallBack = new PaymentCallBack();
 
         try {

+ 3 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java

@@ -4,6 +4,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -67,10 +68,11 @@ public interface PaymentTemplate {
     /**
      * 解析异步通知
      * @param openType
+     * @param paymentClient
      * @param payChannel
      * @param methodName
      * @param request
      * @return
      */
-    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 32 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PaymentClientEnum.java

@@ -0,0 +1,32 @@
+package com.yonge.toolset.payment.base.enums;
+
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 支付客户端
+ *
+ * @author liweifan
+ * @date 2022-04-24
+ */
+public enum PaymentClientEnum implements BaseEnum<String, PaymentClientEnum> {
+
+    STUDENT("学生端"),
+    TEACHER("老师端");
+    
+    private String code;
+    private String msg;
+
+    PaymentClientEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 15 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Base.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 
 import java.io.Serializable;
@@ -17,6 +18,10 @@ public class Base implements Serializable {
      * @updateTime 2022/3/31 11:01
      */
     private OpenEnum openType;
+    /**
+     * 付款应用
+     */
+    private PaymentClientEnum paymentClient;
     /***
      * 支付渠道
      * @author liweifan
@@ -34,8 +39,9 @@ public class Base implements Serializable {
     public Base() {
     }
 
-    public Base(OpenEnum openType, PayChannelEnum payChannel) {
+    public Base(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
         this.openType = openType;
+        this.paymentClient = paymentClient;
         this.payChannel = payChannel;
     }
 
@@ -47,6 +53,14 @@ public class Base implements Serializable {
         this.openType = openType;
     }
 
+    public PaymentClientEnum getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(PaymentClientEnum paymentClient) {
+        this.paymentClient = paymentClient;
+    }
+
     public PayChannelEnum getPayChannel() {
         return payChannel;
     }

+ 4 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java

@@ -2,9 +2,11 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 /**
  * 统一支付对象
+ *
  * @Author: liweifan
  * @Data: 2022/5/10 15:06
  */
@@ -38,8 +40,8 @@ public class ClosePayment extends Base {
      */
     Boolean hasNotify = true;
 
-    public ClosePayment(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public ClosePayment(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

+ 3 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/OpenAuth.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 /**
  * 统一支付授权请求对象
@@ -18,8 +19,8 @@ public class OpenAuth extends Base {
 
     private String code;
 
-    public OpenAuth(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public OpenAuth(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType,paymentClient , payChannel);
     }
 
     public String getCode() {

+ 4 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 import java.util.List;
 import java.util.Map;
@@ -78,7 +79,7 @@ public class Payment extends Base {
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
-    private Map<String,Object> expend;
+    private Map<String, Object> expend;
     /***
      * 三方拉起支付字符串(请求后才有)
      * @author liweifan
@@ -86,8 +87,8 @@ public class Payment extends Base {
      */
     private String payInfo;
 
-    public Payment(OpenEnum openType,PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public Payment(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

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

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 import java.math.BigDecimal;
 
@@ -53,8 +54,8 @@ public class RefundBill extends Base {
      */
     private String reason;
 
-    public RefundBill(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public RefundBill(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

+ 10 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/entity/SysConfigPayment.java

@@ -21,6 +21,8 @@ public class SysConfigPayment implements Serializable {
     private Long id;
 	@TableField(value = "open_type_")
     private String openType;
+    @TableField(value = "client_")
+    private String client;
 	@TableField(value = "param_name_")
     private String paramName;
 	@TableField(value = "param_value_")
@@ -48,6 +50,14 @@ public class SysConfigPayment implements Serializable {
         return openType;
     }
 
+    public String getClient() {
+        return client;
+    }
+
+    public void setClient(String client) {
+        this.client = client;
+    }
+
     public void setOpenType(String openType) {
         this.openType = openType;
     }

+ 6 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java

@@ -4,6 +4,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -23,9 +24,10 @@ public interface PaymentClient {
      * @author liweifan
      * @param: openAuth
      * @updateTime 2022/5/12 10:42
-     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map<java.lang.String,java.lang.Object>>
+     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map < java.lang.String, java.lang.Object>>
      */
     BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth);
+
     /***
      * 统一下单接口
      * @author liweifan
@@ -64,11 +66,13 @@ public interface PaymentClient {
 
     /**
      * 解析异步通知
+     *
      * @param openType
+     * @param paymentClient
      * @param payChannel
      * @param methodName
      * @param request
      * @return
      */
-    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 23 - 10
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/SysConfigPaymentService.java

@@ -1,22 +1,35 @@
 package com.yonge.toolset.payment.core.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.entity.SysConfigPayment;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 
 /**
  * 支付服务配置参数 服务类
+ *
  * @author liweifan
  * @date 2022-05-10
  */
-public interface SysConfigPaymentService extends IService<SysConfigPayment>  {
-	/***
-	 * 获取支付配置
-	 * @author liweifan
-	 * @param: openType 支付服务提供方
-	 * @param: paramName 配置名称
-	 * @updateTime 2022/5/10 22:55
-	 * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
-	 */
-	SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName);
+public interface SysConfigPaymentService extends IService<SysConfigPayment> {
+    /***
+     * 获取支付配置
+     * @author liweifan
+     * @param: openType 支付服务提供方
+     * @param: platform 请求客户端
+     * @param: paramName 配置名称
+     * @updateTime 2022/5/10 22:55
+     * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
+     */
+    SysConfigPayment getPaymentConfig(OpenEnum openType, PaymentClientEnum client, String paramName);
+
+    /***
+     * 获取支付配置
+     * @author liweifan
+     * @param: openType 支付服务提供方
+     * @param: paramName 配置名称
+     * @updateTime 2022/5/10 22:55
+     * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
+     */
+    SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName);
 }

+ 3 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java

@@ -5,6 +5,7 @@ import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -49,7 +50,7 @@ public class PaymentClientImpl implements PaymentClient {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
-        return PaywayUtil.getRealTemplate(openType, payChannel).analysisNotice(openType, payChannel, methodName, request);
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        return PaywayUtil.getRealTemplate(openType, payChannel).analysisNotice(openType, paymentClient, payChannel, methodName, request);
     }
 }

+ 14 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/SysConfigPaymentServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.core.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.dao.SysConfigPaymentDao;
 import com.yonge.toolset.payment.core.entity.SysConfigPayment;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
@@ -31,22 +32,32 @@ public class SysConfigPaymentServiceImpl extends ServiceImpl<SysConfigPaymentDao
     private void init() {
         List<SysConfigPayment> sysConfigPayments = baseMapper.selectList(Wrappers.emptyWrapper());
         for (SysConfigPayment configPayment : sysConfigPayments) {
-            redissonClient.getBucket(REDIS_KEY + ":" + configPayment.getOpenType()+ ":" + configPayment.getParamName()).set(configPayment);
+            redissonClient.getBucket(REDIS_KEY + ":" + configPayment.getOpenType() + ":" + configPayment.getParamName()).set(configPayment);
         }
     }
 
     @Override
+    public SysConfigPayment getPaymentConfig(OpenEnum openType, PaymentClientEnum client, String paramName) {
+        return getPaymentConfig(openType, client.getCode(), paramName);
+    }
+
+    @Override
     public SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName) {
+        return getPaymentConfig(openType, "ALL", paramName);
+    }
+
+    private SysConfigPayment getPaymentConfig(OpenEnum openType, String platform, String paramName) {
         if (null == openType || StringUtil.isEmpty(paramName)) {
             return new SysConfigPayment();
         }
-        SysConfigPayment configPayment = (SysConfigPayment) redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + paramName).get();
+        SysConfigPayment configPayment = (SysConfigPayment) redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + platform + ":" + paramName).get();
         if (null == configPayment) {
             configPayment = baseMapper.selectOne(Wrappers.<SysConfigPayment>lambdaQuery()
                     .eq(SysConfigPayment::getOpenType, openType.getCode())
+                    .eq(SysConfigPayment::getClient, platform)
                     .eq(SysConfigPayment::getParamName, paramName)
             );
-            redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + paramName).set(configPayment);
+            redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + platform + ":" + paramName).set(configPayment);
         }
         return configPayment;
     }

+ 35 - 24
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -12,13 +12,11 @@ import com.alipay.api.response.AlipayTradeAppPayResponse;
 import com.alipay.api.response.AlipayTradeCloseResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.constant.PaymentConstant;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.ClosePaymentCallBack;
 import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
@@ -28,16 +26,12 @@ import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.core.util.RequestKitBean;
 import com.yonge.toolset.payment.original.ali.constant.AlipayConstant;
-import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -52,8 +46,11 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
     @Autowired
     private PaymentProperties paymentProperties;
 
-    @Autowired
-    private AlipayClient alipayClient;
+    @Resource(name = "studentAlipayClient")
+    private AlipayClient studentAlipayClient;
+
+    @Resource(name = "teacherAlipayClient")
+    private AlipayClient teacherAlipayClient;
 
     @Autowired
     private SysConfigPaymentService configPaymentService;
@@ -92,7 +89,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         bizContent.put("merchant_order_no", payment.getOrderNo());
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+            AlipayTradeAppPayResponse response = getAlipayClient(payment.getPaymentClient()).sdkExecute(request);
             if (response.isSuccess()) {
                 payment.setId(response.getTradeNo());
                 payment.setPayInfo(response.getBody());
@@ -119,7 +116,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeQueryResponse response = alipayClient.execute(request);
+            AlipayTradeQueryResponse response = getAlipayClient(payment.getPaymentClient()).execute(request);
 
             if (response.isSuccess()) {
                 payment.setPayAmt(response.getPayAmount());
@@ -136,7 +133,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
                 }
                 return BaseResult.succeed(payment);
             } else {
-                return BaseResult.failed(response.getMsg());
+                return BaseResult.failed(response.getMsg() + ":" + response.getSubMsg());
             }
         } catch (AlipayApiException e) {
             log.error("调用支付宝APP查询订单接口失败,err_code={} err_msg={}", e.getErrCode(), e.getErrMsg());
@@ -149,7 +146,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        if(StringUtil.isEmpty(closePayment.getPaymentNo())){
+        if (StringUtil.isEmpty(closePayment.getPaymentNo())) {
             return BaseResult.failed("缺失渠道关单必要参数");
         }
 
@@ -160,12 +157,12 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeCloseResponse response = alipayClient.execute(request);
+            AlipayTradeCloseResponse response = getAlipayClient(closePayment.getPaymentClient()).execute(request);
             closePayment.setStatus(TradeStatusEnum.succeeded);
             if (response.isSuccess()) {
                 return BaseResult.succeed(closePayment);
             } else {
-                return BaseResult.failed(response.getMsg());
+                return BaseResult.failed(response.getMsg() + ":" + response.getSubMsg());
             }
         } catch (AlipayApiException e) {
             log.error("调用支付宝APP支付关单接口失败,err_code={} err_msg={}", e.getErrCode(), e.getErrMsg());
@@ -189,14 +186,14 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeRefundResponse response = alipayClient.execute(request);
+            AlipayTradeRefundResponse response = getAlipayClient(refundBill.getPaymentClient()).execute(request);
 
             if (response.isSuccess()) {
                 //获取交易状态
                 refundBill.setStatus(TradeStatusEnum.succeeded);
                 return BaseResult.succeed(refundBill);
             } else {
-                return BaseResult.failed(response.getMsg());
+                return BaseResult.failed(response.getMsg() + ":" + response.getSubMsg());
             }
         } catch (AlipayApiException e) {
             log.error("调用支付宝APP支付退款接口失败,err_code={} err_msg={}", e.getErrCode(), e.getErrMsg());
@@ -207,19 +204,22 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         }
     }
 
-
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         PaymentCallBack paymentCallBack = new PaymentCallBack();
         try {
             JSONObject jsonParams = requestKitBean.getReqParamJSON();
             log.info("支付宝回调,data is {}", jsonParams.toJSONString());
 
             //获取验签方式 是否使用证书 YES NO
-            String USE_CERT = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_USE_CERT).getParamValue();
-            String ALI_SIGN_TYPE = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_SIGN_TYPE).getParamValue();
-            String ALI_ALIPAY_PUBLIC_KEY = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue();
-            String CERT_PATH = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CERT_PATH).getParamValue();
+            String USE_CERT = configPaymentService.getPaymentConfig(
+                    OpenEnum.ORIGINAL, paymentClient, AlipayConstant.ALI_USE_CERT).getParamValue();
+            String ALI_SIGN_TYPE = configPaymentService.getPaymentConfig(
+                    OpenEnum.ORIGINAL, paymentClient, AlipayConstant.ALI_SIGN_TYPE).getParamValue();
+            String ALI_ALIPAY_PUBLIC_KEY = configPaymentService.getPaymentConfig(
+                    OpenEnum.ORIGINAL, paymentClient, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue();
+            String CERT_PATH = configPaymentService.getPaymentConfig(
+                    OpenEnum.ORIGINAL, paymentClient, AlipayConstant.ALI_CERT_PATH).getParamValue();
 
             boolean verifyResult;
             if ("YES".equals(USE_CERT)) {
@@ -300,4 +300,15 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         }
     }
 
+
+    private AlipayClient getAlipayClient(PaymentClientEnum paymentClient) {
+        if (PaymentClientEnum.STUDENT.equals(paymentClient)) {
+            return this.studentAlipayClient;
+        }
+        if (PaymentClientEnum.TEACHER.equals(paymentClient)) {
+            return this.teacherAlipayClient;
+        }
+        throw new BizException("未知的客户端类型");
+    }
+
 }

+ 24 - 8
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java

@@ -6,6 +6,7 @@ import com.huifu.adapay.Adapay;
 import com.huifu.adapay.model.MerConfig;
 import com.yonge.toolset.payment.adapay.constant.AdapayConstant;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.ali.constant.AlipayConstant;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,17 +28,32 @@ public class AlipayConfiguration {
      * @updateTime 2022/5/12 14:16
      * @return: com.alipay.api.AlipayClient
      */
-    @Bean
-    public AlipayClient alipayClient() {
+    @Bean(name = "studentAlipayClient")
+    public AlipayClient studentAlipayClient() {
         AlipayClient alipayClient = new DefaultAlipayClient(
                 configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_URL).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APPID).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_APPID).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
                 "json", "UTF-8",
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
+        );
+        return alipayClient;
+    }
+
+    @Bean(name = "teacherAlipayClient")
+    public AlipayClient teacherAlipayClient() {
+        AlipayClient alipayClient = new DefaultAlipayClient(
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_URL).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_APPID).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
+                "json", "UTF-8",
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
         );
         return alipayClient;
     }

+ 67 - 36
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -10,12 +10,11 @@ import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
 import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.util.SignUtils;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -26,34 +25,22 @@ import com.yonge.toolset.payment.base.model.callback.RefundPaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
-import com.yonge.toolset.utils.collection.MapUtil;
-import com.yonge.toolset.utils.date.DateUtil;
-import com.yonge.toolset.utils.obj.ObjectUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import com.yonge.toolset.utils.web.WebUtil;
-import org.apache.commons.collections.map.HashedMap;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.util.EntityUtils;
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.*;
 
 @Component
 public class OriginalWxAppTemplate implements PaymentTemplate {
@@ -66,8 +53,10 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    @Autowired
-    private WxPayService wxPayService;
+    @Resource(name = "studentWxService")
+    private WxPayService studentWxService;
+    @Resource(name = "teacherWxService")
+    private WxPayService teacherWxService;
 
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
@@ -76,7 +65,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<Payment> executePayment(Payment payment) {
-        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, payment.getPaymentClient(), WxpayConstant.WX_APPID).getParamValue();
         String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
 
         WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
@@ -86,6 +75,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         request.setOutTradeNo(payment.getPaymentNo());
         request.setNotifyUrl(paymentProperties.getNotifyUrl()
                 + "/" + payment.getOpenType().getCode()
+                + "/" + payment.getPaymentClient().getCode()
                 + "/" + payment.getPayChannel().getCode()
                 + "/executePayment");
 
@@ -100,8 +90,20 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         request.setAmount(amount);
 
         try {
-            Object orderV3 = wxPayService.createOrderV3(TradeTypeEnum.APP, request);
-            payment.setPayInfo(JSONObject.toJSONString(orderV3));
+            Object orderV3 = getWxPayService(payment.getPaymentClient())
+                    .createOrderV3(TradeTypeEnum.APP, request);
+            Map<String, String> stringStringMap = SignUtils.xmlBean2Map(orderV3);
+            String msg = buildMessage(
+                    APP_ID,
+                    Long.parseLong(stringStringMap.get("timestamp")),
+                    stringStringMap.get("noncestr"),
+                    stringStringMap.get("prepayid")
+            );
+
+            String sign = sign(msg.getBytes(StandardCharsets.UTF_8), payment.getPaymentClient());
+            stringStringMap.put("sign", sign);
+
+            payment.setPayInfo(JSONObject.toJSONString(stringStringMap));
 
             BaseResult<Payment> paymentBaseResult = queryPayment(payment);
             if (paymentBaseResult.getStatus()) {
@@ -129,7 +131,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setOutTradeNo(payment.getPaymentNo());
 
         try {
-            WxPayOrderQueryV3Result res = wxPayService.queryOrderV3(param);
+            WxPayOrderQueryV3Result res = getWxPayService(payment.getPaymentClient())
+                    .queryOrderV3(param);
 
             payment.setId(res.getTransactionId());
             String tradeState = res.getTradeState();
@@ -154,7 +157,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        if(StringUtil.isEmpty(closePayment.getPaymentNo())){
+        if (StringUtil.isEmpty(closePayment.getPaymentNo())) {
             return BaseResult.failed("缺失渠道关单必要参数");
         }
 
@@ -165,7 +168,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setOutTradeNo(closePayment.getPaymentNo());
 
         try {
-            wxPayService.closeOrderV3(param);
+            getWxPayService(closePayment.getPaymentClient())
+                    .closeOrderV3(param);
             closePayment.setStatus(TradeStatusEnum.succeeded);
             return BaseResult.succeed(closePayment);
         } catch (WxPayException e) {
@@ -187,6 +191,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
         param.setNotifyUrl(paymentProperties.getNotifyUrl()
                 + "/" + refundBill.getOpenType().getCode()
+                + "/" + refundBill.getPaymentClient().getCode()
                 + "/" + refundBill.getPayChannel().getCode()
                 + "/refundPayment");
 
@@ -201,7 +206,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setAmount(amount);
 
         try {
-            WxPayRefundV3Result res = wxPayService.refundV3(param);
+            WxPayRefundV3Result res = getWxPayService(refundBill.getPaymentClient())
+                    .refundV3(param);
 
             String refund_id = res.getRefundId();
             refundBill.setId(refund_id);
@@ -216,7 +222,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         //支付回调
         SignatureHeader header = new SignatureHeader();
         header.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
@@ -234,7 +240,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         Map<String, Object> resMsg = new HashMap<>();
         try {
             if (MethodNameEnum.executePayment.equals(methodName)) {
-                WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, header);
+                WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = getWxPayService(paymentClient).parseOrderNotifyV3Result(params, header);
                 log.info("微信APP回调-支付请求:{}", JSONObject.toJSONString(wxPayOrderNotifyV3Result));
 
                 //封装支付回调对象
@@ -254,16 +260,16 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 }
 
                 ExecutePaymentCallBack executePayment = new ExecutePaymentCallBack();
-                if(!StringUtil.isEmpty(result.getAmount().getTotal())){
+                if (!StringUtil.isEmpty(result.getAmount().getTotal())) {
                     executePayment.setPayAmt(new BigDecimal(result.getAmount().getTotal()).divide(new BigDecimal("100")).toString());
                 }
-                if(!StringUtil.isEmpty(result.getSuccessTime())){
+                if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();
                     executePayment.setTradeTime(date);
                 }
                 paymentCallBack.setExecutePaymentCallBack(executePayment);
             } else if (MethodNameEnum.refundPayment.equals(methodName)) {
-                WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = wxPayService.parseRefundNotifyV3Result(params, header);
+                WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = getWxPayService(paymentClient).parseRefundNotifyV3Result(params, header);
                 log.info("微信APP回调-退款请求:{}", JSONObject.toJSONString(wxPayRefundNotifyV3Result));
                 //封装退款回调对象
                 WxPayRefundNotifyV3Result.DecryptNotifyResult result = wxPayRefundNotifyV3Result.getResult();
@@ -286,7 +292,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 refundPayment.setTransNo(result.getRefundId());
                 refundPayment.setRefundAmt(result.getAmount().getRefund());
 
-                if(!StringUtil.isEmpty(result.getSuccessTime())){
+                if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();
                     refundPayment.setTradeTime(date);
                 }
@@ -309,4 +315,29 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
             return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "解析异常");
         }
     }
+
+    String sign(byte[] message, PaymentClientEnum paymentClient) throws Exception {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        PrivateKey privateKey = getWxPayService(paymentClient).getConfig().getPrivateKey();
+        sign.initSign(privateKey);
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }
+
+    String buildMessage(String appid, long timestamp, String nonceStr, String prepay_id) {
+        return appid + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + prepay_id + "\n";
+    }
+
+    private WxPayService getWxPayService(PaymentClientEnum paymentClient) {
+        if (PaymentClientEnum.STUDENT.equals(paymentClient)) {
+            return this.studentWxService;
+        }
+        if (PaymentClientEnum.TEACHER.equals(paymentClient)) {
+            return this.teacherWxService;
+        }
+        throw new BizException("未知的客户端类型");
+    }
 }

+ 35 - 43
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java

@@ -4,6 +4,7 @@ import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
 import org.apache.commons.lang3.StringUtils;
@@ -23,14 +24,19 @@ public class WxpayConfiguration {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    @Bean
-    public WxPayService wxService() {
-        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+    @Bean(name = "studentWxService")
+    public WxPayService studentWxService() {
         String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
-        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
         String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
 
+        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
+        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
+
+        String privateCertPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_CERT_PATH).getParamValue();
+        String privateKeyPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_KEY_PATH).getParamValue();
+
+        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, WxpayConstant.WX_APPID).getParamValue();
+
 
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId(appId);
@@ -38,59 +44,45 @@ public class WxpayConfiguration {
         payConfig.setMchKey(merchantPrivateKey);
         payConfig.setCertSerialNo(merchantSerialNumber);
         payConfig.setApiV3Key(apiV3Key);
-        payConfig.setPrivateCertPath("classpath:apiclient_cert.pem");
-        payConfig.setPrivateKeyPath("classpath:apiclient_key.pem");
-
-        //"classpath:apiclient_cert.pem"
+        payConfig.setPrivateCertPath(privateCertPath);
+        payConfig.setPrivateKeyPath(privateKeyPath);
         // 可以指定是否使用沙箱环境
         payConfig.setUseSandboxEnv(false);
 
+
         WxPayService wxPayService = new WxPayServiceImpl();
         wxPayService.setConfig(payConfig);
         return wxPayService;
     }
 
-/*
-    @Bean
-    public CertificatesManager certificatesManager() throws Exception{
+    @Bean(name = "teacherWxService")
+    public WxPayService teacherWxService() {
         String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String privateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
-        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
         String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
 
-        PrivateKey merchantPrivateKey = PemUtil
-                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
-
-        // 获取证书管理器实例
-        CertificatesManager certificatesManager = CertificatesManager.getInstance();
-
-        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey));
-
-        // 向证书管理器增加需要自动更新平台证书的商户信息
-        certificatesManager.putMerchant(merchantId,
-                wechatPay2Credentials,
-                apiV3Key.getBytes(StandardCharsets.UTF_8)
-        );
-        return certificatesManager;
-    }
-
-    @Bean
-    public CloseableHttpClient closeableHttpClient(CertificatesManager certificatesManager) throws Exception{
-        String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String privateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
         String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
+        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
 
-        PrivateKey merchantPrivateKey = PemUtil
-                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
+        String privateCertPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_CERT_PATH).getParamValue();
+        String privateKeyPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_KEY_PATH).getParamValue();
 
-        // 从证书管理器中获取verifier
-        Verifier verifier = certificatesManager.getVerifier(merchantId);
+        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, WxpayConstant.WX_APPID).getParamValue();
 
-        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
-                .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
-                .withValidator(new WechatPay2Validator(verifier));
 
-        return builder.build();
-    }*/
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(appId);
+        payConfig.setMchId(merchantId);
+        payConfig.setMchKey(merchantPrivateKey);
+        payConfig.setCertSerialNo(merchantSerialNumber);
+        payConfig.setApiV3Key(apiV3Key);
+        payConfig.setPrivateCertPath(privateCertPath);
+        payConfig.setPrivateKeyPath(privateKeyPath);
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
 
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
 }

+ 14 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

@@ -19,6 +19,12 @@ public interface WxpayConstant {
      */
     String WX_MERCHANT_ID = "WX_MERCHANT_ID";
     /***
+     * V3密钥
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_API_V3_KEY = "WX_API_V3_KEY";
+    /***
      * 商户证书序列号
      * @author liweifan
      * @updateTime 2022/5/13 14:09
@@ -31,9 +37,15 @@ public interface WxpayConstant {
      */
     String WX_MERCHANT_PRIVATE_KEY = "WX_MERCHANT_PRIVATE_KEY";
     /***
-     * V3密钥
+     * 证书apiclient_cert.pem在服务器中的路径
      * @author liweifan
      * @updateTime 2022/5/13 14:09
      */
-    String WX_API_V3_KEY = "WX_API_V3_KEY";
+    String WX_PRIVATE_CERT_PATH = "WX_PRIVATE_CERT_PATH";
+    /***
+     * 证书apiclient_key.pem在服务器中的路径
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_PRIVATE_KEY_PATH = "WX_PRIVATE_KEY_PATH";
 }

+ 12 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

@@ -1367,6 +1367,18 @@ public class DateUtil {
 		return null;
 	}
 
+	public static Date offsetMinute(Date parse,int offset){
+		try {
+			Calendar beforeTime = Calendar.getInstance();
+			beforeTime.setTime(parse);
+			beforeTime.add(Calendar.MINUTE, offset);
+			return beforeTime.getTime();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
 	/**
 	 * 获取未来n天(不包含当天)
 	 * @param amount