ソースを参照

支付模块:发送订阅过期消息

wangPH 2 年 前
コミット
039e39ac25
18 ファイル変更279 行追加32 行削除
  1. 10 2
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/OrderApi.java
  2. 16 2
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/SubscriptionApi.java
  3. 5 2
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/hystrix/OrderHystrix.java
  4. 7 1
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/hystrix/SubscriptionHystrix.java
  5. 20 0
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/vo/SubscriptionSchemeVO.java
  6. 2 0
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/vo/SubscriptionsVO.java
  7. 42 5
      pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/enums/account/MemberTypeEnum.java
  8. 12 0
      pdf-office-payment/pom.xml
  9. 2 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/OrderController.java
  10. 21 7
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/SubscriptionController.java
  11. 2 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/entity/Subscription.java
  12. 5 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/mapper/OrdersMapper.java
  13. 3 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/OrdersService.java
  14. 18 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/SubscriptionsService.java
  15. 5 4
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/OrdersServiceImpl.java
  16. 41 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/PaddleWebhookServiceImpl.java
  17. 46 5
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/SubscriptionsServiceImpl.java
  18. 22 0
      pdf-office-payment/src/main/resources/mapper/OrdersMapper.xml

+ 10 - 2
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/OrderApi.java

@@ -1,5 +1,6 @@
 package cn.kdan.cloud.pdf.office.api.payment.feign;
 
+import cn.kdan.cloud.pdf.office.api.payment.dto.ChargebackOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatOrderManualDTO;
 import cn.kdan.cloud.pdf.office.api.payment.feign.hystrix.OrderHystrix;
@@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 
 @Component
@@ -58,9 +60,15 @@ public interface OrderApi {
      * @return Orders
      */
     @GetMapping("/getOrderByTradeNo")
-    ResultMap<OrdersVO> getOrderByTradeNo(@Validated @NotNull(message = "tradeNo不能为空")
+    ResultMap<List<OrdersVO>> getOrderByTradeNo(@Validated @NotNull(message = "tradeNo不能为空")
                                           @RequestParam("tradeNo") String tradeNo);
 
+    /**
+     * 手动推单
+     *
+     * @param chargebackOrderDTO chargebackOrderDTO
+     * @return Void
+     */
     @PostMapping("/chargebackOrder")
-    ResultMap<Void> chargebackOrder();
+    ResultMap<Void> chargebackOrder(@RequestBody ChargebackOrderDTO chargebackOrderDTO);
 }

+ 16 - 2
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/SubscriptionApi.java

@@ -3,6 +3,7 @@ package cn.kdan.cloud.pdf.office.api.payment.feign;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionManualDTO;
 import cn.kdan.cloud.pdf.office.api.payment.feign.hystrix.SubscriptionHystrix;
+import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.common.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
@@ -46,6 +47,19 @@ public interface SubscriptionApi {
      * @param subscriptionManual subscriptionManual
      * @return 订阅id
      */
-    @PostMapping("/creatSubscriptionManual")
-    ResultMap<String> creatSubscriptionManual(@Validated @RequestBody CreatSubscriptionManualDTO subscriptionManual);
+    @PostMapping("/giveSubscriptionManual")
+    ResultMap<String> giveSubscriptionManual(@Validated @RequestBody CreatSubscriptionManualDTO subscriptionManual);
+
+
+    /**
+     * 查询当前用户的订阅计划和支付订单
+     *
+     * @param userId    userId
+     * @param productId productId
+     * @return SubscriptionSchemeVO
+     */
+    @GetMapping("/getSubscriptionSchemeInfo")
+    ResultMap<SubscriptionSchemeVO> getSubscriptionSchemeInfo(@NotNull(message = "用户id不能为空") String userId,
+                                                              @NotNull(message = "productId不能为空") String productId);
+
 }

+ 5 - 2
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/hystrix/OrderHystrix.java

@@ -1,6 +1,7 @@
 package cn.kdan.cloud.pdf.office.api.payment.feign.hystrix;
 
 
+import cn.kdan.cloud.pdf.office.api.payment.dto.ChargebackOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatOrderManualDTO;
 import cn.kdan.cloud.pdf.office.api.payment.feign.OrderApi;
@@ -10,8 +11,10 @@ import cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO;
 import cn.kdan.cloud.pdf.office.common.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Service
 public class OrderHystrix implements OrderApi {
@@ -32,12 +35,12 @@ public class OrderHystrix implements OrderApi {
     }
 
     @Override
-    public ResultMap<OrdersVO> getOrderByTradeNo(@NotNull(message = "tradeNo不能为空") String tradeNo) {
+    public ResultMap<List<OrdersVO>> getOrderByTradeNo(@NotNull(message = "tradeNo不能为空") String tradeNo) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
 
     @Override
-    public ResultMap<Void> chargebackOrder() {
+    public ResultMap<Void> chargebackOrder(@RequestBody ChargebackOrderDTO chargebackOrderDTO) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
 }

+ 7 - 1
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/hystrix/SubscriptionHystrix.java

@@ -4,6 +4,7 @@ package cn.kdan.cloud.pdf.office.api.payment.feign.hystrix;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionManualDTO;
 import cn.kdan.cloud.pdf.office.api.payment.feign.SubscriptionApi;
+import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.common.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
@@ -25,7 +26,12 @@ public class SubscriptionHystrix implements SubscriptionApi {
     }
 
     @Override
-    public ResultMap<String> creatSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual) {
+    public ResultMap<String> giveSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual) {
+        return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
+    }
+
+    @Override
+    public ResultMap<SubscriptionSchemeVO> getSubscriptionSchemeInfo(@NotNull(message = "用户id不能为空") String userId, @NotNull(message = "productId不能为空") String productId) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
 }

+ 20 - 0
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/vo/SubscriptionSchemeVO.java

@@ -0,0 +1,20 @@
+package cn.kdan.cloud.pdf.office.api.payment.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author ComPDFKit-WPH 2023/2/7
+ */
+@Data
+@ToString
+public class SubscriptionSchemeVO implements Serializable {
+
+    private SubscriptionsVO subscriptionsVO;
+
+    private List<OrdersVO> ordersVOS;
+
+}

+ 2 - 0
pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/vo/SubscriptionsVO.java

@@ -119,4 +119,6 @@ public class SubscriptionsVO implements Serializable {
     private String userId;
 
     private String subscriptionId;
+
+    private String orderId;
 }

+ 42 - 5
pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/enums/account/MemberTypeEnum.java

@@ -1,31 +1,68 @@
 package cn.kdan.cloud.pdf.office.common.enums.account;
 
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
 /**
  * PDF OFFICE会员类型
- *
  */
 public enum MemberTypeEnum {
 
     /**
      * mac会员 1 windows会员 2 mac+window会员3
      */
-    MAC_MEMBER(1),
+    MAC_MEMBER(1, "mac"),
     /**
      * windows会员
      */
-    WINDOWS_MEMBER(2),
+    WINDOWS_MEMBER(2, "windows"),
     /**
      * mac+window会员
      */
-    MAC_WINDOWS_MEMBER(3);
+    MAC_WINDOWS_MEMBER(3, "mac+windows"),
 
+    NULL_MEMBER(-1, "null"),
+;
     private final Integer value;
 
-    MemberTypeEnum(Integer value){
+    private final String stringValue;
+
+    MemberTypeEnum(Integer value, String stringValue) {
         this.value = value;
+        this.stringValue = stringValue;
     }
 
     public Integer value() {
         return value;
     }
+
+    public String stringValue() {
+        return stringValue;
+    }
+
+    /**
+     * 产品平台
+     * com.brother.pdfreaderpro.windows.product_2
+     *
+     * @param code com.brother.pdfreaderpro.windows.product_2
+     * @return MemberTypeEnum
+     */
+    public static MemberTypeEnum getEnumByCode(@NotNull String code) {
+        for (MemberTypeEnum modeEnum : MemberTypeEnum.values()) {
+            if (code.contains(modeEnum.stringValue())) {
+                return modeEnum;
+            }
+        }
+        return NULL_MEMBER;
+    }
+
+    public static MemberTypeEnum getEnumByValue(@NotNull Integer value) {
+        for (MemberTypeEnum modeEnum : MemberTypeEnum.values()) {
+            if (modeEnum.value().equals(value)) {
+                return modeEnum;
+            }
+        }
+        return NULL_MEMBER;
+    }
+
 }

+ 12 - 0
pdf-office-payment/pom.xml

@@ -24,6 +24,18 @@
             <version>0.0.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>cn.kdan.pdf.office</groupId>
+            <artifactId>pdf-office-api-account</artifactId>
+            <version>0.0.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>cn.kdan.pdf.office</groupId>
+                    <artifactId>pdf-office-common</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>

+ 2 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/OrderController.java

@@ -14,6 +14,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023/2/6
@@ -70,7 +71,7 @@ public class OrderController {
      * @return Orders
      */
     @GetMapping("/getOrderByTradeNo")
-    public ResultMap<OrdersVO> getOrderByTradeNo(@Validated @NotNull(message = "tradeNo不能为空")
+    public ResultMap<List<OrdersVO>> getOrderByTradeNo(@Validated @NotNull(message = "tradeNo不能为空")
                                                  @RequestParam("tradeNo") String tradeNo){
         return ResultMap.success(ordersService.getOrderByTradeNo(tradeNo));
     }

+ 21 - 7
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/SubscriptionController.java

@@ -2,6 +2,7 @@ package cn.kdan.cloud.pdf.office.payment.controller;
 
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionManualDTO;
+import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
 import cn.kdan.cloud.pdf.office.payment.service.SubscriptionsService;
@@ -22,6 +23,7 @@ import javax.validation.constraints.NotNull;
 public class SubscriptionController {
 
     private final SubscriptionsService subscriptionsService;
+
     /**
      * 创建订阅信息
      *
@@ -29,7 +31,7 @@ public class SubscriptionController {
      * @return 订阅id
      */
     @PostMapping("/creatSubscription")
-    public ResultMap<String> creatSubscription(@Validated @RequestBody CreatSubscriptionDTO subscriptionInfo){
+    public ResultMap<String> creatSubscription(@Validated @RequestBody CreatSubscriptionDTO subscriptionInfo) {
         return ResultMap.success(subscriptionsService.creatSubscription(subscriptionInfo));
     }
 
@@ -42,20 +44,32 @@ public class SubscriptionController {
      */
     @GetMapping("/getSubscriptions")
     public ResultMap<SubscriptionsVO> getSubscriptions(@Validated @NotNull(message = "userId 不能为空") @RequestParam("userId") String userId,
-                                                       @NotNull(message = "productId 不能为空") @RequestParam("productId") String productId){
-        return ResultMap.success(subscriptionsService.getSubscriptions(userId,productId));
+                                                       @NotNull(message = "productId 不能为空") @RequestParam("productId") String productId) {
+        return ResultMap.success(subscriptionsService.getSubscriptions(userId, productId));
     }
 
     /**
-     * 手动创建订阅信息
+     * 手动创建订阅信息 赠送
      *
      * @param subscriptionManual subscriptionManual
      * @return 订阅id
      */
-    @PostMapping("/creatSubscriptionManual")
-    public ResultMap<String> creatSubscriptionManual(@Validated @RequestBody CreatSubscriptionManualDTO subscriptionManual){
-        return ResultMap.success(subscriptionsService.creatSubscriptionManual(subscriptionManual));
+    @PostMapping("/giveSubscriptionManual")
+    public ResultMap<String> giveSubscriptionManual(@Validated @RequestBody CreatSubscriptionManualDTO subscriptionManual) {
+        return ResultMap.success(subscriptionsService.giveSubscriptionManual(subscriptionManual));
     }
 
+    /**
+     * 查询当前用户的订阅计划和支付订单
+     *
+     * @param userId    userId
+     * @param productId productId
+     * @return SubscriptionSchemeVO
+     */
+    @GetMapping("/getSubscriptionSchemeInfo")
+    public ResultMap<SubscriptionSchemeVO> getSubscriptionSchemeInfo(@Validated @NotNull(message = "用户id不能为空") String userId,
+                                                                     @Validated @NotNull(message = "productId不能为空") String productId) {
+        return ResultMap.success(subscriptionsService.getSubscriptionSchemeInfo(userId, productId));
+    }
 
 }

+ 2 - 0
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/entity/Subscription.java

@@ -123,4 +123,6 @@ public class Subscription extends BaseEntity{
 
     private String thirdSubscriptionId;
 
+    private String orderId;
+
 }

+ 5 - 0
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/mapper/OrdersMapper.java

@@ -1,11 +1,16 @@
 package cn.kdan.cloud.pdf.office.payment.mapper;
 
+import cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO;
 import cn.kdan.cloud.pdf.office.payment.entity.Order;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023-01-29
  */
 public interface OrdersMapper extends BaseMapper<Order> {
 
+    List<OrdersVO> selectOrdersByTradeNo(@Param("tradeNo") String tradeNo);
 }

+ 3 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/OrdersService.java

@@ -10,6 +10,8 @@ import cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO;
 import cn.kdan.cloud.pdf.office.payment.entity.Order;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023-01-29
  */
@@ -52,7 +54,7 @@ public interface OrdersService extends IService<Order> {
      * @param tradeNo tradeNo
      * @return Orders
      */
-    OrdersVO getOrderByTradeNo(String tradeNo);
+    List<OrdersVO> getOrderByTradeNo(String tradeNo);
 
     /**
      * 手动创建虚拟订单

+ 18 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/SubscriptionsService.java

@@ -3,6 +3,7 @@ package cn.kdan.cloud.pdf.office.payment.service;
 import cn.kdan.cloud.pdf.office.api.payment.dto.ChargebackOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionManualDTO;
+import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.payment.entity.Subscription;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -41,13 +42,21 @@ public interface SubscriptionsService extends IService<Subscription> {
     SubscriptionsVO getSubscriptions(String userId, String productId);
 
     /**
-     * 手动创建订阅信息
+     * 创建订阅信息 自动续订
      *
      * @param subscriptionManual subscriptionManual
      * @return 订阅id
      */
     String creatSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual);
 
+    /**
+     * 手动创建订阅信息 赠送
+     *
+     * @param subscriptionManual subscriptionManual
+     * @return 订阅id
+     */
+    String giveSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual);
+
     /**
      * 退单
      *
@@ -55,4 +64,12 @@ public interface SubscriptionsService extends IService<Subscription> {
      */
     void chargebackSubscription(ChargebackOrderDTO chargebackOrderDTO);
 
+    /**
+     * 查询当前用户的订阅计划和支付订单
+     *
+     * @param userId    userId
+     * @param productId productId
+     * @return SubscriptionSchemeVO
+     */
+    SubscriptionSchemeVO getSubscriptionSchemeInfo(String userId, String productId);
 }

+ 5 - 4
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/OrdersServiceImpl.java

@@ -37,6 +37,8 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -153,12 +155,11 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Order> implemen
     }
 
     @Override
-    public OrdersVO getOrderByTradeNo(String tradeNo) {
-        OrdersVO ordersVO = new OrdersVO();
-        BeanUtils.copyProperties(this.baseMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getTradeNo, tradeNo)), ordersVO);
-        return ordersVO;
+    public List<OrdersVO> getOrderByTradeNo(String tradeNo) {
+        return this.baseMapper.selectOrdersByTradeNo(tradeNo);
     }
 
+
     @Override
     public OrderUpdateVO creatOrderManual(CreatOrderManualDTO creatOrderManual) {
         Order orders = new Order();

+ 41 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/PaddleWebhookServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.kdan.cloud.pdf.office.payment.service.impl;
 
+import cn.kdan.cloud.pdf.office.api.account.dto.UpdateUserForPaySuccessDTO;
+import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
 import cn.kdan.cloud.pdf.office.api.payment.bo.OrderSucceededBO;
 import cn.kdan.cloud.pdf.office.api.payment.constant.SubscriptionConstant;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
@@ -10,8 +12,14 @@ import cn.kdan.cloud.pdf.office.api.payment.enums.PaymentMethodEnum;
 import cn.kdan.cloud.pdf.office.api.payment.vo.OrderUpdateVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
+import cn.kdan.cloud.pdf.office.api.product.feign.ProductApi;
+import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
+import cn.kdan.cloud.pdf.office.common.enums.account.MemberTypeEnum;
+import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserStatusEnum;
+import cn.kdan.cloud.pdf.office.common.enums.account.PaidTypeEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
+import cn.kdan.cloud.pdf.office.common.vo.UserInfoVO;
 import cn.kdan.cloud.pdf.office.payment.error.ErrorMessage;
 import cn.kdan.cloud.pdf.office.payment.service.OrdersService;
 import cn.kdan.cloud.pdf.office.payment.service.PaddleWebhookService;
@@ -36,6 +44,11 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
 
     private final SubscriptionsService subscriptionsService;
 
+    private final UserApi userApi;
+
+    private final ProductApi productApi;
+
+
     @Override
     public void subscriptionCreatSucceeded(PaddleWebhookDTO paddleWebhookDTO) {
         log.info("paddle 订阅创建已成功 paddle订单id:{}",paddleWebhookDTO.getCheckoutId());
@@ -53,12 +66,37 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
         creatSubscription.setUserId(orderUpdate.getUserId());
         creatSubscription.setOrderId(orderUpdate.getOrderId());
         subscriptionsService.creatSubscription(creatSubscription);
+        // 用户信息
+        UserInfoVO userInfo = userApi.getById(orderUpdate.getUserId()).getResult();
+        // 订阅状态
+        String validFlag = userInfo.getValidFlag();
+        // 查询订单信息获取产品id
+        OrdersVO orderById = ordersService.getOrderById(orderUpdate.getOrderId());
+        // 根据产品id查询产品信息
+        ProductVO productVO = productApi.getProduct(orderById.getProductId()).getResult();
+        // 获取产品平台
+        String code = productVO.getCode();
+        MemberTypeEnum memberTypeEnum = MemberTypeEnum.getEnumByCode(code);
+        // 判断是否已有订阅
+        if (PDFOfficeUserStatusEnum.SUBSCRIPTION_IN_PROGRESS.value().equals(validFlag)) {
+            MemberTypeEnum enumByValue = MemberTypeEnum.getEnumByValue(userInfo.getMemberType());
+            if ((memberTypeEnum.equals(MemberTypeEnum.MAC_MEMBER) && enumByValue.equals(MemberTypeEnum.WINDOWS_MEMBER))
+                    || memberTypeEnum.equals(MemberTypeEnum.WINDOWS_MEMBER) && enumByValue.equals(MemberTypeEnum.MAC_MEMBER)){
+                memberTypeEnum = MemberTypeEnum.MAC_WINDOWS_MEMBER;
+            }
+        }
+        // 修改订单状态
+        UpdateUserForPaySuccessDTO successDTO = new UpdateUserForPaySuccessDTO();
+        successDTO.setUserId(orderUpdate.getUserId());
+        successDTO.setPayTpe(PaidTypeEnum.SUBSCRIBE.value());
+        successDTO.setMemberType(memberTypeEnum.value());
+        userApi.updateUserForPaySuccess(successDTO);
     }
 
     @Override
     public void subscriptionPaymentSucceeded(PaddleWebhookDTO paddleWebhookDTO) {
         log.info("paddle 订阅的支付订单已成功 paddle订单id:{}",paddleWebhookDTO.getCheckoutId());
-        OrdersVO orderByTradeNo = ordersService.getOrderByTradeNo(paddleWebhookDTO.getPassthrough());
+        OrdersVO orderByTradeNo = ordersService.getOrderByTradeNo(paddleWebhookDTO.getPassthrough()).get(0);
         // 判断当前是否存在订阅
         SubscriptionsVO subscriptions = subscriptionsService.getSubscriptions(orderByTradeNo.getUserId(), orderByTradeNo.getProductId());
         if (ObjectUtils.isEmpty(subscriptions)){
@@ -82,5 +120,7 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
         subscriptionManual.setThirdSubscriptionId(paddleWebhookDTO.getSubscriptionId());
         subscriptionManual.setStatus(SubscriptionConstant.actived);
         subscriptionsService.creatSubscriptionManual(subscriptionManual);
+
+        // TODO 发送订阅过期消息到截至时间
     }
 }

+ 46 - 5
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/SubscriptionsServiceImpl.java

@@ -1,16 +1,23 @@
 package cn.kdan.cloud.pdf.office.payment.service.impl;
 
+import cn.kdan.cloud.pdf.office.api.account.dto.UpdateUserForPaySuccessDTO;
+import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
 import cn.kdan.cloud.pdf.office.api.payment.constant.SubscriptionConstant;
 import cn.kdan.cloud.pdf.office.api.payment.dto.ChargebackOrderDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreatSubscriptionManualDTO;
+import cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO;
+import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.api.product.feign.ProductApi;
 import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
+import cn.kdan.cloud.pdf.office.common.enums.status.UserStatusEnum;
 import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
+import cn.kdan.cloud.pdf.office.common.vo.UserInfoVO;
 import cn.kdan.cloud.pdf.office.payment.client.PaddleClient;
 import cn.kdan.cloud.pdf.office.payment.entity.Subscription;
 import cn.kdan.cloud.pdf.office.payment.mapper.SubscriptionsMapper;
+import cn.kdan.cloud.pdf.office.payment.service.OrdersService;
 import cn.kdan.cloud.pdf.office.payment.service.SubscriptionsService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -24,6 +31,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023-01-28
@@ -37,6 +45,10 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
 
     private final PaddleClient paddleClient;
 
+    private final UserApi userApi;
+
+    private final OrdersService ordersService;
+
     @Override
     public IPage<Subscription> page(Subscription query) {
         return this.page(new Page<>(query.getPage(), query.getSize()), Wrappers.query(query));
@@ -55,12 +67,13 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
         LocalDateTime endTime = getEndTime(subscriptionInfo, originalTime);
         // 产生一条最新的订阅信息
         Subscription subscription = new Subscription();
-        subscription.setProductId(subscriptionInfo.getUserId());
+        subscription.setProductId(subscriptionInfo.getProductId());
         subscription.setStatus(SubscriptionConstant.actived);
         subscription.setUserId(subscriptionInfo.getUserId());
         subscription.setStartDate(MyDateUtils.localDateTimeToDate(now));
         subscription.setEndDate(MyDateUtils.localDateTimeToDate(endTime));
         subscription.setThirdSubscriptionId(subscriptionInfo.getSubscriptionId());
+        subscription.setOrderId(subscriptionInfo.getOrderId());
         this.baseMapper.insert(subscription);
         return subscription.getId();
     }
@@ -72,7 +85,7 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
         BeanUtils.copyProperties(this.baseMapper.selectOne(new LambdaQueryWrapper<Subscription>()
                 .eq(Subscription::getUserId, userId)
                 .eq(Subscription::getProductId, productId)
-                .eq(Subscription::getStatus,SubscriptionConstant.actived)
+                .eq(Subscription::getStatus, SubscriptionConstant.actived)
                 .orderByDesc(Subscription::getEndDate)
                 .last("LIMIT 1")), subscriptionsVO);
         return subscriptionsVO;
@@ -81,10 +94,23 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
     @Override
     public String creatSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual) {
         CreatSubscriptionDTO creatSubscriptionDTO = new CreatSubscriptionDTO();
-        BeanUtils.copyProperties(subscriptionManual,creatSubscriptionDTO);
+        BeanUtils.copyProperties(subscriptionManual, creatSubscriptionDTO);
         return this.creatSubscription(creatSubscriptionDTO);
     }
 
+    @Override
+    public String giveSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual) {
+        this.creatSubscriptionManual(subscriptionManual);
+        // 修改用户状态
+        // 判断当前用户是否是订阅中
+        UserInfoVO userInfoVO = userApi.getById(subscriptionManual.getUserId()).getResult();
+        // TODO 修改用户状态为试用中
+        String validFlag = userInfoVO.getValidFlag();
+//        UpdateUserForPaySuccessDTO successDTO = new UpdateUserForPaySuccessDTO();
+//        userApi.updateUserForPaySuccess(null);
+        return null;
+    }
+
     @Override
     public void chargebackSubscription(ChargebackOrderDTO chargebackOrderDTO) {
         Subscription subscription = this.baseMapper.selectById(chargebackOrderDTO.getSubscriptionId());
@@ -98,11 +124,26 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
         this.baseMapper.updateById(subscriptions);
     }
 
+    @Override
+    public SubscriptionSchemeVO getSubscriptionSchemeInfo(String userId, String productId) {
+        // 获取最新订阅信息
+        SubscriptionsVO subscriptions = this.getSubscriptions(userId, productId);
+        // 获取该订阅关联的所有订单
+        String orderId = subscriptions.getOrderId();
+        String thirdTradeNo = ordersService.getOrderById(orderId).getThirdTradeNo();
+        List<OrdersVO> ordersVOS = ordersService.getOrderByTradeNo(thirdTradeNo);
+        SubscriptionSchemeVO subscriptionSchemeVO = new SubscriptionSchemeVO();
+        subscriptionSchemeVO.setSubscriptionsVO(subscriptions);
+        subscriptionSchemeVO.setOrdersVOS(ordersVOS);
+        return subscriptionSchemeVO;
+    }
+
+
     /**
      * 获取订阅结束时间
      *
      * @param subscriptionInfo subscriptionInfo
-     * @param originalTime    开始时间
+     * @param originalTime     开始时间
      * @return 结束时间
      */
     private LocalDateTime getEndTime(CreatSubscriptionDTO subscriptionInfo, LocalDateTime originalTime) {
@@ -115,7 +156,7 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
      * 获取初始开始时间
      *
      * @param subscriptionInfo subscriptionInfo
-     * @param now now
+     * @param now              now
      * @return LocalDateTime
      */
     private LocalDateTime getOriginalTime(CreatSubscriptionDTO subscriptionInfo, LocalDateTime now) {

+ 22 - 0
pdf-office-payment/src/main/resources/mapper/OrdersMapper.xml

@@ -25,4 +25,26 @@
         <result property="detailType" column="detail_type" />
     </resultMap>
 
+    <select id="selectOrdersByTradeNo" resultType="cn.kdan.cloud.pdf.office.api.payment.vo.OrdersVO">
+        select id,app_id,subscription_id,trade_no,third_order_no
+            ,price
+            ,payment
+            ,status
+            ,result
+            ,created_at
+            ,updated_at
+            ,page_pay_url
+            ,invoice_no
+            ,third_trade_no
+            ,product_id
+            ,discount
+            ,reduced_price
+            ,is_vpp
+            ,type
+            ,detail_type
+            ,user_id
+        from order
+        where third_trade_no = #{tradeNo}
+    </select>
+
 </mapper>