Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	pdf-office-email/src/test/java/cn/kdan/cloud/pdf/office/email/SendEmailTest.java
#	pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/listener/PaymentListener.java
tangxiangan 2 years ago
parent
commit
d63689fc66
29 changed files with 275 additions and 88 deletions
  1. 1 1
      pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/service/impl/UserServiceImpl.java
  2. 27 2
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/utils/SubscriptionUtil.java
  3. 3 0
      pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/vo/UserSubscriptionInfoVO.java
  4. 1 1
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/vo/SubscriptionsVO.java
  5. 2 2
      pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/enums/PlatformEnum.java
  6. 10 0
      pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/feign/ProductApi.java
  7. 6 0
      pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/feign/hystrix/ProductHystrix.java
  8. 10 10
      pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/enums/account/PDFOfficeUserStatusEnum.java
  9. 2 0
      pdf-office-email/src/test/java/cn/kdan/cloud/pdf/office/email/SendEmailTest.java
  10. 0 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/client/PaddleClient.java
  11. 20 4
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/listener/PaymentListener.java
  12. 9 19
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/PaddleWebhookServiceImpl.java
  13. 16 10
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/SubscriptionsServiceImpl.java
  14. 10 7
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/PaddleWebhookMonitor.java
  15. 6 0
      pdf-office-pdf-website/pom.xml
  16. 0 4
      pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/PDFOfficeWebsiteApplication.java
  17. 17 0
      pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/controller/PdfOfficeAppController.java
  18. 12 0
      pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/service/ProductInfoService.java
  19. 6 0
      pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/service/impl/ProductInfoServiceImpl.java
  20. 12 0
      pdf-office-product/pom.xml
  21. 4 0
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/PDFOfficeProductApplication.java
  22. 14 0
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/controller/ProductController.java
  23. 12 0
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/error/ErrorMessage.java
  24. 5 0
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/mapper/ProductMapper.java
  25. 1 1
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/ActivityInformationService.java
  26. 10 0
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/ProductService.java
  27. 3 2
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/impl/ActivityInformationServiceImpl.java
  28. 30 9
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/impl/ProductServiceImpl.java
  29. 26 15
      pdf-office-product/src/main/resources/mapper/ProductMapper.xml

+ 1 - 1
pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/service/impl/UserServiceImpl.java

@@ -235,7 +235,7 @@ public class UserServiceImpl implements UserService {
     private void handleLogOff(User user,String remark) {
         user.setRemark(remark);
         user.setUpdatedAt(new Date());
-        user.setValidFlag(PDFOfficeUserStatusEnum.LOGGED_OUT.value());
+        user.setValidFlag(PDFOfficeUserStatusEnum.LOGGED_OUT.value().toString());
         userMapper.updateByPrimaryKeySelective(user);
     }
 

+ 27 - 2
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/utils/SubscriptionUtil.java

@@ -1,12 +1,14 @@
-package cn.kdan.cloud.pdf.office.payment.utils;
+package cn.kdan.cloud.pdf.office.api.account.utils;
 
+import cn.kdan.cloud.pdf.office.api.account.vo.UserSubscriptionInfoVO;
 import cn.kdan.cloud.pdf.office.common.constant.RabbitMqConstant;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.util.CollectionUtils;
 
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023/2/8
@@ -39,4 +41,27 @@ public class SubscriptionUtil {
                     return msg;
                 }));
     }
+
+
+    /**
+     * 获取当前平台的订阅信息
+     * 为null代表没有当前订阅信息
+     *
+     * @param userSubscriptionInfoVOS userSubscriptionInfoVOS
+     * @param platform                platform
+     * @return UserSubscriptionInfoVO
+     */
+    public static UserSubscriptionInfoVO getUserSubscriptionInfoByPlatform(List<UserSubscriptionInfoVO> userSubscriptionInfoVOS,
+                                                                           Integer platform) {
+        if (CollectionUtils.isEmpty(userSubscriptionInfoVOS)) {
+            return null;
+        }
+        for (UserSubscriptionInfoVO userSubscriptionInfoVO : userSubscriptionInfoVOS) {
+            if (userSubscriptionInfoVO.getPlatform().equals(platform)) {
+                return userSubscriptionInfoVO;
+            }
+        }
+        return null;
+    }
+
 }

+ 3 - 0
pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/vo/UserSubscriptionInfoVO.java

@@ -1,7 +1,10 @@
 package cn.kdan.cloud.pdf.office.api.account.vo;
 
+import lombok.Data;
+
 import java.util.Date;
 
+@Data
 public class UserSubscriptionInfoVO {
     private String id;
 

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

@@ -125,7 +125,7 @@ public class SubscriptionsVO implements Serializable {
     private String appId;
 
     /**
-     * 产品平台 1:windows,2:mac  PlatformEnum
+     * 产品平台 1:mac,2:windows  PlatformEnum
      */
     private Integer platform;
 }

+ 2 - 2
pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/enums/PlatformEnum.java

@@ -8,8 +8,8 @@ import lombok.Getter;
  * 平台枚举
  */
 public enum PlatformEnum {
-    WINDOWS(1),
-    MAC(2),
+    MAC(1),
+    WINDOWS(2),
     ;
     @Getter
     private final Integer value;

+ 10 - 0
pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/feign/ProductApi.java

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 
 @Component
@@ -32,4 +33,13 @@ public interface ProductApi {
     ResultMap<IPage<ProductVO>> getProductList(@RequestParam("size") Long size, @RequestParam("page") Long page,
                                                @RequestParam("appId") String appId);
 
+    /**
+     * 获取新用户专用活动
+     *
+     * @param appId appId
+     * @return 新用户专用活动
+     */
+    @GetMapping("/getNewUserProduct")
+    ResultMap<List<ProductVO>> getNewUserProduct(@RequestParam String appId);
+
 }

+ 6 - 0
pdf-office-api/pdf-office-api-product/src/main/java/cn/kdan/cloud/pdf/office/api/product/feign/hystrix/ProductHystrix.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Service
 public class ProductHystrix implements ProductApi {
@@ -30,4 +31,9 @@ public class ProductHystrix implements ProductApi {
     public ResultMap<IPage<ProductVO>> getProductList(Long size, Long page, String appId) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
+
+    @Override
+    public ResultMap<List<ProductVO>> getNewUserProduct(String appId) {
+        return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
+    }
 }

+ 10 - 10
pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/enums/account/PDFOfficeUserStatusEnum.java

@@ -7,20 +7,20 @@ package cn.kdan.cloud.pdf.office.common.enums.account;
 public enum PDFOfficeUserStatusEnum {
     //0已注销(1订阅中2订阅过期3试用中4试用过期5注销中)
 
-    LOGGED_OUT("0"),
-    SUBSCRIPTION_IN_PROGRESS("1"),
-    SUBSCRIPTION_EXPIRED("2"),
-    TRIAL("3"),
-    TRIAL_EXPIRED("4"),
-    LOGGED_OUT_ING("5");
+    LOGGED_OUT(0),
+    SUBSCRIPTION_IN_PROGRESS(1),
+    SUBSCRIPTION_EXPIRED(2),
+    TRIAL(3),
+    TRIAL_EXPIRED(4),
+    LOGGED_OUT_ING(5);
 
-    private final String value;
+    private final Integer value;
 
-    PDFOfficeUserStatusEnum(String value) {
+    PDFOfficeUserStatusEnum(Integer value) {
         this.value = value;
     }
 
-    public String value() {
+    public Integer value() {
         return value;
     }
 
@@ -30,7 +30,7 @@ public enum PDFOfficeUserStatusEnum {
      * @param value value
      * @return PDFOfficeUserStatusEnum
      */
-    public static PDFOfficeUserStatusEnum getEnumByValue(String value) {
+    public static PDFOfficeUserStatusEnum getEnumByValue(Integer value) {
         for (PDFOfficeUserStatusEnum pdfOfficeUserStatusEnum : PDFOfficeUserStatusEnum.values()) {
             if (pdfOfficeUserStatusEnum.value.equals(value)) {
                 return pdfOfficeUserStatusEnum;

+ 2 - 0
pdf-office-email/src/test/java/cn/kdan/cloud/pdf/office/email/SendEmailTest.java

@@ -25,6 +25,8 @@ public class SendEmailTest {
     public void sendTest(){
         EmailSendBO emailSendBO = new EmailSendBO();
         emailSendBO.setToEmail("ddfme123@163.com");
+//        emailSendBO.setEmailTitle("123");
+//        emailSendBO.setTemplateId("1");
         Map<String,String> map = new HashMap<>();
         map.put("@username@","wph");
         emailSendBO.setSendContent(map);

+ 0 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/client/PaddleClient.java

@@ -101,7 +101,6 @@ public class PaddleClient {
             log.error("paddle 生成支付链接调用失败\n:{},\n参数:{}", paddleResult.getError(), creatSubscriptions);
             throw new BackendRuntimeException(paddleResult.getError().getMessage());
         }
-        // TODO 返回信息再调整
         return paddleResult.getResponse();
     }
 

+ 20 - 4
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/listener/PaymentListener.java

@@ -2,6 +2,7 @@ package cn.kdan.cloud.pdf.office.payment.listener;
 
 import cn.kdan.cloud.pdf.office.api.account.dto.UpdateUserForOrderDTO;
 import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
+import cn.kdan.cloud.pdf.office.api.account.vo.UserSubscriptionInfoVO;
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionsVO;
 import cn.kdan.cloud.pdf.office.api.product.enums.PlatformEnum;
 import cn.kdan.cloud.pdf.office.common.constant.RabbitMqConstant;
@@ -9,6 +10,8 @@ import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserStatusEnum;
 import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
 import cn.kdan.cloud.pdf.office.payment.service.OrdersService;
 import cn.kdan.cloud.pdf.office.payment.service.SubscriptionsService;
+import cn.kdan.cloud.pdf.office.api.account.utils.SubscriptionUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.rabbitmq.client.Channel;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -17,6 +20,7 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023/1/11
@@ -32,7 +36,6 @@ public class PaymentListener {
 
     private final UserApi userApi;
 
-
     /**
      * 关闭订单 监听
      *
@@ -71,10 +74,23 @@ public class PaymentListener {
             if (now.compareTo(endDate) > 0) {
                 // 修改用户状态
                 // 获取当前用户的订阅状态
-                String validFlag = userApi.getById(subscription.getUserId()).getResult().getValidFlag();
-                PDFOfficeUserStatusEnum userStatusEnum = PDFOfficeUserStatusEnum.getEnumByValue(validFlag);
-                // TODO 修改用户状态
+                List<UserSubscriptionInfoVO> subscriptionInfoList = userApi.getInfoById(subscription.getUserId()).getResult().getSubscriptionInfoList();
+                UserSubscriptionInfoVO userSubscriptionInfoVO = SubscriptionUtil.getUserSubscriptionInfoByPlatform(subscriptionInfoList, subscription.getPlatform());
+                Integer userStatus = Integer.MIN_VALUE;
+                if (!ObjectUtils.isEmpty(userSubscriptionInfoVO)) {
+                    userStatus = userSubscriptionInfoVO.getStatus();
+                    PDFOfficeUserStatusEnum userStatusEnum = PDFOfficeUserStatusEnum.getEnumByValue(userSubscriptionInfoVO.getStatus());
+                    if (userStatusEnum == PDFOfficeUserStatusEnum.SUBSCRIPTION_IN_PROGRESS){
+                        userStatus = PDFOfficeUserStatusEnum.SUBSCRIPTION_EXPIRED.value();
+                    }else if (userStatusEnum == PDFOfficeUserStatusEnum.TRIAL){
+                        userStatus = PDFOfficeUserStatusEnum.TRIAL_EXPIRED.value();
+                    }
+                }
+                // 修改用户状态
                 UpdateUserForOrderDTO paySuccessDTO = new UpdateUserForOrderDTO();
+                paySuccessDTO.setUserId(subscription.getUserId());
+                paySuccessDTO.setPlatform(subscription.getPlatform());
+                paySuccessDTO.setUserStatus(userStatus);
                 userApi.updateUserForOrder(paySuccessDTO);
             }
             channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

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

@@ -14,12 +14,10 @@ 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.UserVO;
 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;
@@ -27,6 +25,7 @@ import cn.kdan.cloud.pdf.office.payment.service.SubscriptionsService;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
@@ -48,6 +47,8 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
 
     private final ProductApi productApi;
 
+    private final RabbitTemplate rabbitTemplate;
+
 
     @Override
     public void subscriptionCreatSucceeded(PaddleWebhookDTO paddleWebhookDTO) {
@@ -68,31 +69,22 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
         creatSubscription.setAppId(orderUpdate.getAppId());
         creatSubscription.setProductId(orderUpdate.getProductId());
         creatSubscription.setThirdSubscriptionId(paddleWebhookDTO.getSubscriptionId());
-        subscriptionsService.creatSubscription(creatSubscription);
+        String subscriptionId = subscriptionsService.creatSubscription(creatSubscription);
         // 用户信息
-        UserVO 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;
-            }
-        }
+        Integer platform = productVO.getPlatform();
+
         // 修改订单状态
         UpdateUserForOrderDTO successDTO = new UpdateUserForOrderDTO();
         successDTO.setUserId(orderUpdate.getUserId());
         successDTO.setPayTpe(PaidTypeEnum.SUBSCRIBE.value());
-//        successDTO.setMemberType(memberTypeEnum.value());
+        successDTO.setPlatform(platform);
+        successDTO.setUserStatus(PDFOfficeUserStatusEnum.SUBSCRIPTION_IN_PROGRESS.value());
+        successDTO.setEndDate(subscriptionsService.getSubscriptionBySubscriptionId(subscriptionId).getEndDate());
         userApi.updateUserForOrder(successDTO);
     }
 
@@ -123,7 +115,5 @@ public class PaddleWebhookServiceImpl implements PaddleWebhookService {
         subscriptionManual.setThirdSubscriptionId(paddleWebhookDTO.getSubscriptionId());
         subscriptionManual.setStatus(SubscriptionConstant.actived);
         subscriptionsService.creatSubscriptionManual(subscriptionManual);
-
-        // TODO 发送订阅过期消息到截至时间
     }
 }

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

@@ -1,5 +1,6 @@
 package cn.kdan.cloud.pdf.office.payment.service.impl;
 
+import cn.kdan.cloud.pdf.office.api.account.dto.UpdateUserForOrderDTO;
 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;
@@ -9,14 +10,15 @@ import cn.kdan.cloud.pdf.office.api.payment.vo.*;
 import cn.kdan.cloud.pdf.office.api.product.enums.PlatformEnum;
 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.PDFOfficeUserStatusEnum;
+import cn.kdan.cloud.pdf.office.common.enums.account.PaidTypeEnum;
 import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
-import cn.kdan.cloud.pdf.office.common.vo.UserVO;
 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 cn.kdan.cloud.pdf.office.payment.utils.SubscriptionUtil;
+import cn.kdan.cloud.pdf.office.api.account.utils.SubscriptionUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -102,15 +104,19 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
 
     @Override
     public String giveSubscriptionManual(CreatSubscriptionManualDTO subscriptionManual) {
-        this.creatSubscriptionManual(subscriptionManual);
+        String subscriptionId = this.creatSubscriptionManual(subscriptionManual);
+        // 获取当前产品的所属平台
+        Integer platform = productApi.getProduct(subscriptionManual.getProductId()).getResult().getPlatform();
+        // TODO 判断当前用户的当前平台是否已在订阅中
         // 修改用户状态
-        // 判断当前用户是否是订阅中
-        UserVO userVO = userApi.getById(subscriptionManual.getUserId()).getResult();
-        // TODO 修改用户状态为试用中
-        String validFlag = userVO.getValidFlag();
-//        UpdateUserForPaySuccessDTO successDTO = new UpdateUserForPaySuccessDTO();
-//        userApi.updateUserForPaySuccess(null);
-        return null;
+        // 修改用户状态为试用中
+        UpdateUserForOrderDTO successDTO = new UpdateUserForOrderDTO();
+        successDTO.setUserId(subscriptionManual.getUserId());
+        successDTO.setPayTpe(PaidTypeEnum.ON_TRIAL.value());
+        successDTO.setUserStatus(Integer.valueOf(PDFOfficeUserStatusEnum.TRIAL.value()));
+        successDTO.setPlatform(platform);
+        userApi.updateUserForOrder(successDTO);
+        return subscriptionId;
     }
 
     @Override

File diff suppressed because it is too large
+ 10 - 7
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/PaddleWebhookMonitor.java


+ 6 - 0
pdf-office-pdf-website/pom.xml

@@ -121,6 +121,12 @@
                 </exclusion>
             </exclusions>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+            <scope>compile</scope>
+        </dependency>
         <!-- spring security start -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 0 - 4
pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/PDFOfficeWebsiteApplication.java

@@ -1,10 +1,8 @@
 package cn.kdan.cloud.pdf.office.website;
 
-import cn.kdan.cloud.pdf.office.api.account.annotation.EnableAccountApiClient;
 import cn.kdan.cloud.pdf.office.api.payment.annotation.EnablePaymentApiClient;
 import cn.kdan.cloud.pdf.office.api.product.annotation.EnableProductApiClient;
 import cn.kdan.cloud.pdf.office.common.annotation.EnableCommonFeignExceptionHandle;
-import cn.kdan.cloud.pdf.office.common.annotation.EnableCommonTools;
 import cn.kdan.cloud.pdf.office.common.annotation.EnableControllerExceptionHandler;
 import cn.kdan.cloud.pdf.office.common.annotation.EnableMybatisPlusConfig;
 import org.mybatis.spring.annotation.MapperScan;
@@ -24,10 +22,8 @@ import org.springframework.cloud.netflix.hystrix.EnableHystrix;
 @EnableMybatisPlusConfig
 @MapperScan("cn.kdan.cloud.pdf.office.website.mapper")
 @EnableCaching
-@EnableCommonTools
 @EnableProductApiClient
 @EnablePaymentApiClient
-@EnableAccountApiClient
 @EnableCommonFeignExceptionHandle
 @EnableControllerExceptionHandler
 public class PDFOfficeWebsiteApplication {

+ 17 - 0
pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/controller/PdfOfficeAppController.java

@@ -2,15 +2,20 @@ package cn.kdan.cloud.pdf.office.website.controller;
 
 import cn.kdan.cloud.pdf.office.api.payment.vo.SubscriptionSchemeVO;
 import cn.kdan.cloud.pdf.office.api.product.enums.PlatformEnum;
+import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
 import cn.kdan.cloud.pdf.office.website.service.PaymentService;
+import cn.kdan.cloud.pdf.office.website.service.ProductInfoService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023/2/9
@@ -24,6 +29,8 @@ public class PdfOfficeAppController {
 
     private final PaymentService paymentService;
 
+    private final ProductInfoService productInfoService;
+
     /**
      * 获取订单记录
      *
@@ -46,5 +53,15 @@ public class PdfOfficeAppController {
         return ResultMap.success(paymentService.getSubscriptionEndDate(platform));
     }
 
+    /**
+     * 获取新用户专用活动
+     *
+     * @param appId appId
+     * @return 新用户专用活动
+     */
+    @GetMapping("/getNewUserProduct")
+    public ResultMap<List<ProductVO>> getNewUserProduct(@Validated @NotNull(message = "appId不能为空") @RequestParam String appId){
+        return productInfoService.getNewUserProduct(appId);
+    }
 
 }

+ 12 - 0
pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/service/ProductInfoService.java

@@ -1,7 +1,19 @@
 package cn.kdan.cloud.pdf.office.website.service;
 
+import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
+import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
+
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023/2/6
  */
 public interface ProductInfoService {
+    /**
+     * 获取新用户专用活动
+     *
+     * @param appId appId
+     * @return 新用户专用活动
+     */
+    ResultMap<List<ProductVO>> getNewUserProduct(String appId);
 }

+ 6 - 0
pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/service/impl/ProductInfoServiceImpl.java

@@ -10,6 +10,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023/2/6
  */
@@ -20,4 +22,8 @@ public class ProductInfoServiceImpl implements ProductInfoService {
 
     private final ProductApi productApi;
 
+    @Override
+    public ResultMap<List<ProductVO>> getNewUserProduct(String appId) {
+        return productApi.getNewUserProduct(appId);
+    }
 }

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

@@ -96,6 +96,18 @@
             </exclusions>
         </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>
+
     </dependencies>
 
 

+ 4 - 0
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/PDFOfficeProductApplication.java

@@ -1,5 +1,7 @@
 package cn.kdan.cloud.pdf.office.product;
 
+import cn.kdan.cloud.pdf.office.api.account.annotation.EnableAccountApiClient;
+import cn.kdan.cloud.pdf.office.common.annotation.EnableCommonFeignExceptionHandle;
 import cn.kdan.cloud.pdf.office.common.annotation.EnableControllerExceptionHandler;
 import cn.kdan.cloud.pdf.office.common.annotation.EnableMybatisPlusConfig;
 import org.mybatis.spring.annotation.MapperScan;
@@ -18,6 +20,8 @@ import org.springframework.cloud.netflix.hystrix.EnableHystrix;
 @EnableMybatisPlusConfig
 @MapperScan("cn.kdan.cloud.pdf.office.product.mapper")
 @EnableControllerExceptionHandler
+@EnableAccountApiClient
+@EnableCommonFeignExceptionHandle
 public class PDFOfficeProductApplication {
 
     public static void main(String[] args) {

+ 14 - 0
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/controller/ProductController.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023/2/1
@@ -57,4 +58,17 @@ public class ProductController {
         productListDTO.setAppId(appId);
         return ResultMap.success(productService.page(productListDTO));
     }
+
+    /**
+     * 获取新用户专用活动
+     *
+     * @param appId appId
+     * @return 新用户专用活动
+     */
+    @GetMapping("/getNewUserProduct")
+    public ResultMap<List<ProductVO>> getNewUserProduct(@RequestParam String appId) {
+        return ResultMap.success(productService.getNewUserProduct(appId));
+    }
+
+
 }

+ 12 - 0
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/error/ErrorMessage.java

@@ -0,0 +1,12 @@
+package cn.kdan.cloud.pdf.office.product.error;
+
+/**
+ * @author ComPDFKit-WPH 2023/1/29
+ * <p>
+ * ErrorMessage
+ */
+public interface ErrorMessage {
+
+    String NO_CURRENT_ACTIVITY = "没有当前活动类型信息";
+    String USER_IS_NOT_NEW_USER = "用户不是新用户";
+}

+ 5 - 0
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/mapper/ProductMapper.java

@@ -1,11 +1,16 @@
 package cn.kdan.cloud.pdf.office.product.mapper;
 
+import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
 import cn.kdan.cloud.pdf.office.product.entity.Product;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author ComPDFKit-WPH 2023-01-28
  */
 public interface ProductMapper extends BaseMapper<Product> {
 
+    List<ProductVO> selectNewUserProductByAppId(@Param("appId") String appId);
 }

+ 1 - 1
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/ActivityInformationService.java

@@ -11,7 +11,7 @@ public interface ActivityInformationService extends IService<ActivityInformation
     /**
      * 获取活动信息
      *
-     * @param type 活动类型
+     * @param type 活动类型  活动类型id  1-新用户专用,2正常
      * @return 活动信息
      */
     ActivityInfoVO getActivityInfoByType(String type);

+ 10 - 0
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/ProductService.java

@@ -7,6 +7,8 @@ import cn.kdan.cloud.pdf.office.product.entity.Product;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023-01-28
  */
@@ -35,4 +37,12 @@ public interface ProductService extends IService<Product> {
      * @return Product
      */
     ProductVO getProduct(String productId);
+
+    /**
+     * 获取新用户专用活动
+     *
+     * @param appId appId
+     * @return 新用户专用活动
+     */
+    List<ProductVO> getNewUserProduct(String appId);
 }

+ 3 - 2
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/impl/ActivityInformationServiceImpl.java

@@ -3,6 +3,7 @@ package cn.kdan.cloud.pdf.office.product.service.impl;
 import cn.kdan.cloud.pdf.office.api.product.vo.ActivityInfoVO;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.product.entity.ActivityInformation;
+import cn.kdan.cloud.pdf.office.product.error.ErrorMessage;
 import cn.kdan.cloud.pdf.office.product.mapper.ActivityInformationMapper;
 import cn.kdan.cloud.pdf.office.product.service.ActivityInformationService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -22,8 +23,8 @@ public class ActivityInformationServiceImpl extends ServiceImpl<ActivityInformat
     public ActivityInfoVO getActivityInfoByType(String type) {
         ActivityInfoVO activityInfoVO = this.baseMapper.selectActivityInfoByType(type);
         if (ObjectUtils.isNull(activityInfoVO)){
-            // TODO 查询数据为空抛出异常 没有当前活动类型信息
-            throw new BackendRuntimeException();
+            // 查询数据为空抛出异常 没有当前活动类型信息
+            throw new BackendRuntimeException(ErrorMessage.NO_CURRENT_ACTIVITY);
         }
         return activityInfoVO;
     }

+ 30 - 9
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/service/impl/ProductServiceImpl.java

@@ -1,12 +1,17 @@
 package cn.kdan.cloud.pdf.office.product.service.impl;
 
+import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
+import cn.kdan.cloud.pdf.office.api.account.utils.SubscriptionUtil;
+import cn.kdan.cloud.pdf.office.api.account.vo.UserSubscriptionInfoVO;
 import cn.kdan.cloud.pdf.office.api.product.dto.ProductListDTO;
 import cn.kdan.cloud.pdf.office.api.product.vo.ActivityInfoVO;
 import cn.kdan.cloud.pdf.office.api.product.vo.ProductPriceVo;
 import cn.kdan.cloud.pdf.office.api.product.vo.ProductVO;
+import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserStatusEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.common.utils.JsonUtils;
 import cn.kdan.cloud.pdf.office.product.entity.Product;
+import cn.kdan.cloud.pdf.office.product.error.ErrorMessage;
 import cn.kdan.cloud.pdf.office.product.mapper.ProductMapper;
 import cn.kdan.cloud.pdf.office.product.service.ActivityInformationService;
 import cn.kdan.cloud.pdf.office.product.service.ProductService;
@@ -33,10 +38,12 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     private final ActivityInformationService activityService;
 
+    private final UserApi userAPi;
+
     @Override
     public IPage<ProductVO> page(ProductListDTO query) {
         Page<Product> productPage = this.page(new Page<>(query.getPage(), query.getSize()), new LambdaQueryWrapper<Product>()
-                .eq(Product::getAppId,query.getAppId()));
+                .eq(Product::getAppId, query.getAppId()));
         List<ProductVO> productVOS = JsonUtils.jsonStringToList(JsonUtils.getJsonString(productPage.getRecords()), ProductVO.class);
         productVOS.forEach(productVO -> {
             if (!ObjectUtils.isEmpty(productVO.getActivityId())) {
@@ -51,20 +58,24 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     @Override
     public ProductPriceVo getProductPrice(String productId, String userId) {
         Product product = this.baseMapper.selectOne(new LambdaQueryWrapper<Product>()
-                .select(Product::getPrice, Product::getCnyPrice, Product::getPaddleProductId,Product::getActivityId)
+                .select(Product::getPrice, Product::getCnyPrice, Product::getPaddleProductId, Product::getActivityId)
                 .eq(Product::getId, productId));
-
         ProductPriceVo productPriceVo = new ProductPriceVo();
         productPriceVo.setPaddleProductId(product.getPaddleProductId());
         // 判断当前产品是否有活动 获取活动的最终价格
-        if (!ObjectUtils.isEmpty(product.getActivityId())){
+        if (!ObjectUtils.isEmpty(product.getActivityId())) {
             ActivityInfoVO activityInfo = activityService.getActivityInfoByActivityId(product.getActivityId());
             // 判断是否是新用户专用
-            if (activityInfo.getActivityType() == 1){
-                // TODO 判断当前用户是否是新用户
-                productPriceVo.setPrice(BigDecimal.ONE);
-                productPriceVo.setCnyPrice(BigDecimal.ONE);
-            }else {
+            List<UserSubscriptionInfoVO> subscriptionInfoList = userAPi.getInfoById(userId).getResult().getSubscriptionInfoList();
+            if (activityInfo.getActivityType() == 1) {
+                UserSubscriptionInfoVO userSubscriptionInfoVO = SubscriptionUtil.getUserSubscriptionInfoByPlatform(subscriptionInfoList, product.getPlatform());
+                if (ObjectUtils.isEmpty(userSubscriptionInfoVO)) {
+                    productPriceVo.setPrice(activityInfo.getFinalPrice());
+                    productPriceVo.setCnyPrice(activityInfo.getFinalCnyPrice());
+                } else {
+                    throw new BackendRuntimeException(ErrorMessage.USER_IS_NOT_NEW_USER);
+                }
+            } else {
                 productPriceVo.setPrice(activityInfo.getFinalPrice());
                 productPriceVo.setCnyPrice(activityInfo.getFinalCnyPrice());
             }
@@ -78,4 +89,14 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         BeanUtils.copyProperties(this.baseMapper.selectOne(new LambdaQueryWrapper<Product>().eq(Product::getId, productId)), productVO);
         return productVO;
     }
+
+    @Override
+    public List<ProductVO> getNewUserProduct(String appId) {
+        List<ProductVO> productVOS = this.baseMapper.selectNewUserProductByAppId(appId);
+        for (ProductVO productVO : productVOS) {
+            productVO.setActivityInfo(activityService.getActivityInfoByActivityId(productVO.getActivityId()));
+        }
+        return productVOS;
+    }
+
 }

+ 26 - 15
pdf-office-product/src/main/resources/mapper/ProductMapper.xml

@@ -1,24 +1,35 @@
 <?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="cn.kdan.cloud.pdf.office.payment.mapper.ProductMapper">
+<mapper namespace="cn.kdan.cloud.pdf.office.product.mapper.ProductMapper">
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="ProductResultMap" type="cn.kdan.cloud.pdf.office.product.entity.Product">
-        <result property="id" column="id" />
-        <result property="productName" column="product_name" />
-        <result property="appId" column="app_id" />
-        <result property="code" column="code" />
-        <result property="price" column="price" />
-        <result property="forVersion" column="for_version" />
-        <result property="forPeriod" column="for_period" />
-        <result property="maxDeviceNum" column="max_device_num" />
-        <result property="description" column="description" />
-        <result property="cnyPrice" column="cny_price" />
-        <result property="parentProductId" column="parent_product_id" />
-        <result property="sonIds" column="son_ids" />
-        <result property="displayPrice" column="display_price" />
-        <result property="cnyDisplayPrice" column="cny_display_price" />
+        <result property="id" column="id"/>
+        <result property="productName" column="product_name"/>
+        <result property="appId" column="app_id"/>
+        <result property="code" column="code"/>
+        <result property="price" column="price"/>
+        <result property="forVersion" column="for_version"/>
+        <result property="forPeriod" column="for_period"/>
+        <result property="maxDeviceNum" column="max_device_num"/>
+        <result property="description" column="description"/>
+        <result property="cnyPrice" column="cny_price"/>
+        <result property="parentProductId" column="parent_product_id"/>
+        <result property="sonIds" column="son_ids"/>
+        <result property="displayPrice" column="display_price"/>
+        <result property="cnyDisplayPrice" column="cny_display_price"/>
     </resultMap>
 
+
+    <select id="selectNewUserProductByAppId" resultType="cn.kdan.cloud.pdf.office.api.product.vo.ProductVO">
+        SELECT p.*
+        FROM `product` p
+                 LEFT JOIN activity_information a on p.activity_id = a.id
+        where p.app_id = #{appId}
+          and a.activity_type = 1
+          and a.is_enable = 1
+
+    </select>
+
 </mapper>