tangxiangan преди 4 месеца
родител
ревизия
bf3db7d08f
променени са 22 файла, в които са добавени 160 реда и са изтрити 42 реда
  1. 9 2
      pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/service/impl/UserServiceImpl.java
  2. 2 1
      pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/dto/UpdateUserForOrderDTO.java
  3. 3 0
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/OrderApi.java
  4. 5 0
      pdf-office-api/pdf-office-api-payment/src/main/java/cn/kdan/cloud/pdf/office/api/payment/feign/hystrix/OrderHystrix.java
  5. 16 16
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/client/GooglePayClient.java
  6. 1 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/SubscriptionController.java
  7. 1 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/mapper/SubscriptionsMapper.java
  8. 2 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/OrderService.java
  9. 6 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/GooglePayServiceImpl.java
  10. 9 4
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/OrderServiceImpl.java
  11. 6 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/SubscriptionsServiceImpl.java
  12. 2 2
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/WebhookServiceImpl.java
  13. 1 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/GoogleWebhookMonitor.java
  14. 1 1
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/google/DeveloperNotification.java
  15. 41 0
      pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/google/TestNotification.java
  16. 6 0
      pdf-office-payment/src/main/resources/mapper/SubscriptionsMapper.xml
  17. 0 1
      pdf-office-pdf-website/src/main/java/cn/kdan/cloud/pdf/office/website/service/impl/LotteryServiceImpl.java
  18. 2 1
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/controller/PrizeController.java
  19. 1 1
      pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/entity/Prize.java
  20. 11 7
      pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/controller/UserCenterController.java
  21. 32 0
      pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/controller/UserController.java
  22. 3 3
      pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/service/impl/AuthServiceImpl.java

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

@@ -143,7 +143,11 @@ public class UserServiceImpl implements UserService {
         //通过用户可以查到对应的app
         user.setUpdatedAt(new Date());
         //账号类型 付费账号1 免费账号0 AccountTypeEnum
-        user.setAccountType(AccountTypeEnum.PAID_ACCOUNT.value());
+        if(ObjectUtils.isEmpty(updateUserForOrderDTO.getAccountType())){
+            user.setAccountType(updateUserForOrderDTO.getAccountType().value());
+        }else {
+            user.setAccountType(AccountTypeEnum.PAID_ACCOUNT.value());
+        }
         //通过用户id和平台类型查询会员信息表,如果有会员信息则更新,如果没有会员信息就插入
         //platform是从product中来的app_id = 1时: 0免费,1永久版,2订阅,3AI
         String appId = StringUtils.isEmpty(updateUserForOrderDTO.getAppId()) ? "16":updateUserForOrderDTO.getAppId();
@@ -246,7 +250,10 @@ public class UserServiceImpl implements UserService {
         if(!CollectionUtils.isEmpty(list)){
             list.forEach(item->{
                 //如果订阅中,则提示不能注销
-                if(item.getStatus().equals(PDFOfficeUserSubscriptionStatusEnum.SUBSCRIPTION_IN_PROGRESS.value()) ){
+                if(item.getStatus().equals(PDFOfficeUserSubscriptionStatusEnum.SUBSCRIPTION_IN_PROGRESS.value())&&item.getAppId().equals("16")){
+                    throw new BackendRuntimeException(ExceptionEnum.EXCEPTION_MSG_USER_SUBSCRIPTION_IN_PROGRESS);
+                }
+                if(item.getPayType().equals(PayTypeEnum.AUTO.value())&&item.getAppId().equals("1")){
                     throw new BackendRuntimeException(ExceptionEnum.EXCEPTION_MSG_USER_SUBSCRIPTION_IN_PROGRESS);
                 }
             });

+ 2 - 1
pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/dto/UpdateUserForOrderDTO.java

@@ -1,5 +1,6 @@
 package cn.kdan.cloud.pdf.office.api.account.dto;
 
+import cn.kdan.cloud.pdf.office.common.enums.account.AccountTypeEnum;
 import lombok.Data;
 
 import java.util.Date;
@@ -35,5 +36,5 @@ public class UpdateUserForOrderDTO {
     private String appId;
 
     private Integer point;
-
+    private AccountTypeEnum accountType;
 }

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

@@ -70,6 +70,9 @@ public interface OrderApi {
     @PostMapping("/googleEquityVerification")
     ResultMap<UserInfoVO> googleEquityVerification(@RequestBody GooglePayDTO googlePayDTO);
 
+    @PostMapping("/updateStatusPayment")
+    ResultMap<Boolean> updateStatusPayment(@RequestParam("userId") String userId, @RequestParam("productId") String productId);
+
     /**
      * 手动创建虚拟订单
      *

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

@@ -53,6 +53,11 @@ public class OrderHystrix implements OrderApi {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
 
+    @Override
+    public ResultMap<Boolean> updateStatusPayment(String userId, String productId) {
+        return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
+    }
+
     @Override
     public ResultMap<OrderUpdateVO> createOrderManual(CreateOrderManualDTO createOrderManual) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);

+ 16 - 16
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/client/GooglePayClient.java

@@ -144,22 +144,22 @@ public class GooglePayClient {
         return false;
     }
     public static void main(String[] args) {
-        testID();
-//        RestTemplate restTemplate = new RestTemplate();
-//        String url = "https://backend.pdfreaderpro.com/system/google/getSubscriptionGoogleOrderV2" +
-//                "?packageName=" + "com.pdftechnologies.pdfreaderpro" + "&purchaseToken=" + "kkhjiepogghbfcbjndbocpij.AO-J1Ozil3Sz_DnqbMHsyharu_cXVpw2Ev-GFa3gLgbQR7nrumGUXT9hKhydymhgjzcI-KWkpRGB3XrKgX331uCKJPCdbm7t-xpR_j_a5NfzzleHPjVozKI";
-//
-//        // 设置请求头
-//        HttpHeaders headers = new HttpHeaders();
-//        // 创建 HttpEntity
-//        HttpEntity<String> entity = new HttpEntity<>(headers);
-//
-//        // 发起请求
-//        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
-//
-//        SubscriptionPurchaseV3 subscriptionsV2 = JSON.parseObject(response.getBody(),SubscriptionPurchaseV3.class);
+//        testID();
+        RestTemplate restTemplate = new RestTemplate();
+        String url = "https://backend.pdfreaderpro.com/system/google/getSubscriptionGoogleOrderV2" +
+                "?packageName=" + "com.pdftechnologies.pdfreaderpro" + "&purchaseToken=" + "kkocpfbdghkkhpponlnmecao.AO-J1OxH2Cn0M_vUA_SDglNA92yA6jOxahaU-nC8ZljmOvEcQlIGrUtA5YvlDraJL8uFty95fMzl7us6VvvA2ow1TmewRaMBKbdANHudEuQBLMIRSC9Qykw";
+
+        // 设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        // 创建 HttpEntity
+        HttpEntity<String> entity = new HttpEntity<>(headers);
+
+        // 发起请求
+        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+        //判断有没有testPurchase 字段
+        SubscriptionPurchaseV3 subscriptionsV2 = JSON.parseObject(response.getBody(),SubscriptionPurchaseV3.class);
 //        // 创建目标对象
-//        SubscriptionPurchaseV2 venueV2 = new SubscriptionPurchaseV2();
+        SubscriptionPurchaseV2 venueV2 = new SubscriptionPurchaseV2();
 //
 //        // 复制属性
 //        BeanUtils.copyProperties(subscriptionsV2, venueV2);
@@ -177,7 +177,7 @@ public class GooglePayClient {
     private static void testID() {
         String appName = "PDF Reader Pro";
         String packageName = "com.pdftechnologies.pdfreaderpro";
-        String purchaseToken = "bkjackdmmdnlbmijboodamnf.AO-J1Owiy2o66jZ80kOOP0g4ClNMZyRxkZ5ZxXXErAqWEj1Xt8lsXT_IxfxNgdOy0ClYZZdB2En8o9Fx8oAyegOgsExKmbIBh12j5rjPc-6SYxmJ_jp-pPQ";
+        String purchaseToken = "kkocpfbdghkkhpponlnmecao.AO-J1OxH2Cn0M_vUA_SDglNA92yA6jOxahaU-nC8ZljmOvEcQlIGrUtA5YvlDraJL8uFty95fMzl7us6VvvA2ow1TmewRaMBKbdANHudEuQBLMIRSC9Qykw" ;
         InputStream content = new IOUtils().getGoogleKey();
         try {
             GoogleCredentials googleCredentials = GoogleCredentials.fromStream(content)

+ 1 - 0
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/controller/SubscriptionController.java

@@ -129,4 +129,5 @@ public class SubscriptionController {
     ResultMap<Boolean> judgeAiDiscount(@RequestParam("userId") String userId) {
         return ResultMap.success(subscriptionsService.judgeAiDiscount(userId));
     }
+
 }

+ 1 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/mapper/SubscriptionsMapper.java

@@ -56,5 +56,5 @@ public interface SubscriptionsMapper extends BaseMapper<Subscription> {
     int countAiTrail(@Param("userId") String userId);
     List<Subscription> countAdvancedSubscriptions(@Param("userId") String userId);
     int countSubscriptionTrail(@Param("userId") String userId);
-
+    int countSubscription(@Param("userId") String userId);
 }

+ 2 - 0
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/OrderService.java

@@ -148,4 +148,6 @@ public interface OrderService extends IService<Order> {
      * @return
      */
     List<OrdersVO> getOrderListByThirdOrderNo(String thirdOrderNo);
+
+    Order getOrderByUserIdAndProductId(String userId, String productId);
 }

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

@@ -16,6 +16,7 @@ import cn.kdan.cloud.pdf.office.common.enums.ExceptionEnum;
 import cn.kdan.cloud.pdf.office.common.enums.payment.SubscriptionTypeEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.common.utils.CommonUtils;
+import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
 import cn.kdan.cloud.pdf.office.common.vo.UserInfoVO;
 import cn.kdan.cloud.pdf.office.common.vo.UserVO;
 import cn.kdan.cloud.pdf.office.payment.client.GooglePayClient;
@@ -127,6 +128,7 @@ public class GooglePayServiceImpl implements GooglePayService {
         createSubscription.setPrice(price);
         createSubscription.setPayTime(0);
         subscriptionsService.createSubscription(createSubscription);
+        String readeNo = MyDateUtils.getTimeStamp() + "-" + product.getId() + "-" + (int) ((Math.random() * 9 + 1) * 1000);
         CreateOrderManualDTO orderManualDTO = CreateOrderManualDTO.builder()
                 .thirdTradeNo(subscriptionPurchaseV2.getExternalAccountIdentifiers().getObfuscatedExternalAccountId())
                 .thirdOrderNo(subscriptionPurchaseV2.getLatestOrderId())
@@ -143,6 +145,7 @@ public class GooglePayServiceImpl implements GooglePayService {
                 .subscriptionType(1)
                 .payNumber(1)
                 .result(googlePayDTO.getPurchaseToken())
+                .tradeNo(readeNo)
                 .build();
         orderService.createOrderManual(orderManualDTO);
         sendBuyEmail(product, userVO);
@@ -236,4 +239,7 @@ public class GooglePayServiceImpl implements GooglePayService {
         // 根据第三放订阅id查询对应的用户id和产品id
         webhookService.handleMemberUnsubscribeFollowUpActions(thirdSubscriptionId);
     }
+
+
+
 }

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

@@ -23,7 +23,6 @@ import cn.kdan.cloud.pdf.office.common.enums.ExceptionEnum;
 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.client.AppStoreClient;
 import cn.kdan.cloud.pdf.office.payment.client.PaddleClient;
 import cn.kdan.cloud.pdf.office.payment.client.PaypalClient;
 import cn.kdan.cloud.pdf.office.payment.entity.Order;
@@ -56,7 +55,6 @@ import org.springframework.data.redis.cache.RedisCache;
 import org.springframework.data.redis.cache.RedisCacheManager;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.io.IOException;
@@ -81,7 +79,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     private final RabbitTemplate rabbitTemplate;
 
-    private final AppStoreClient appStoreClient;
 
     private final PaypalClient paypalClient;
 
@@ -91,7 +88,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     private final PayCenterConfigProperties payCenterConfigProperties;
 
-    private final RestTemplate restTemplate = new RestTemplate();
 
     @Resource(name = "myRedisCacheManager")
     private RedisCacheManager myRedisCacheManager;
@@ -812,4 +808,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     public List<OrdersVO> getOrderListByThirdOrderNo(String thirdOrderNo) {
         return this.baseMapper.selectOrdersByThirdOrderNo(thirdOrderNo);
     }
+
+    @Override
+    public Order getOrderByUserIdAndProductId(String userId, String productId) {
+        return this.baseMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getUserId,userId)
+                .eq(Order::getProductId,productId)
+                .eq(Order::getStatus,2)
+                .orderByDesc(Order::getPayDate).last("Limit 1"));
+    }
+
 }

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

@@ -12,6 +12,7 @@ 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.constant.CommonConstant;
+import cn.kdan.cloud.pdf.office.common.enums.account.AccountTypeEnum;
 import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserSubscriptionPayTypeEnum;
 import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserSubscriptionStatusEnum;
 import cn.kdan.cloud.pdf.office.common.enums.account.PayTypeEnum;
@@ -75,7 +76,7 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
     @Override
     public boolean judgeTrail(String userId){
         //todo 试用商品
-        if(this.baseMapper.countSubscriptionTrail(userId)==0){
+        if(this.baseMapper.countSubscriptionTrail(userId)==0&&this.baseMapper.countSubscription(userId)==0){
             return true;
         }
         return false;
@@ -168,6 +169,9 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
         if(productVO.getPlatform().equals(3)&&productVO.getAppId().equals(CommonConstant.PDF_READER_PRO_APP_ID)){
             successDTO.setPoint(Integer.valueOf(productVO.getPoints()));
         }
+        if(subscription.getPrice().compareTo(BigDecimal.valueOf(0))==0){
+            successDTO.setAccountType(AccountTypeEnum.PAID_ACCOUNT);
+        }
         userApi.updateUserForOrder(successDTO);
     }
 
@@ -333,6 +337,7 @@ public class SubscriptionsServiceImpl extends ServiceImpl<SubscriptionsMapper, S
         return this.baseMapper.updateStatusByUserIdAndProductId(status, userId, productId);
     }
 
+
     @Override
     public Boolean judgeAiDiscount(String userId) {
         AtomicBoolean haveAdvancedSubscriptions = new AtomicBoolean(false);

+ 2 - 2
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/service/impl/WebhookServiceImpl.java

@@ -390,11 +390,11 @@ public class WebhookServiceImpl implements WebhookService {
     @Override
     public void handleMemberUnsubscribeFollowUpActions(String thirdSubscriptionId) {
         SubscriptionsVO subscription = subscriptionsService.getSubscriptionByThirdSubscriptionId(thirdSubscriptionId);
-        if(StringUtils.isEmpty(subscription.getId())){
+        if(ObjectUtils.isEmpty(subscription)){
             log.error("第三方订阅id{}未绑定",thirdSubscriptionId);
             return;
         }
-        if(ObjectUtils.isEmpty(subscription)){
+        if(StringUtils.isEmpty(subscription.getId())){
             log.error("第三方订阅id{}未绑定",thirdSubscriptionId);
             return;
         }

+ 1 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/GoogleWebhookMonitor.java

@@ -74,7 +74,7 @@ public class GoogleWebhookMonitor {
                 log.error("谷歌订单验证状态异常:{}", subscriptionGoogleOrderV2);
                 return ResponseEntity.status(HttpStatus.OK).build(); // 返回 200 OK
             }
-            String lockKey = Integer.toString(notificationType).concat(subscriptionNotification.getSubscriptionId()) + "-RedissonLock";
+            String lockKey = Integer.toString(notificationType).concat(subscriptionGoogleOrderV2.getExternalAccountIdentifiers().getObfuscatedExternalAccountId()) + "-RedissonLock";
             RLock rLock = redissonClient.getLock(lockKey);
 
             try {

+ 1 - 1
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/google/DeveloperNotification.java

@@ -34,6 +34,6 @@ public class DeveloperNotification {
         /**
          * 如果此字段存在,则此通知与测试发布相关。这些只通过 Google Play 管理中心发送。请注意,此字段与 subscriptionNotification 和 oneTimeProductNotification 互斥。
          */
-//        private TestNotification testNotification;
+        private TestNotification testNotification;
 
 }

+ 41 - 0
pdf-office-payment/src/main/java/cn/kdan/cloud/pdf/office/payment/webhook/google/TestNotification.java

@@ -0,0 +1,41 @@
+package cn.kdan.cloud.pdf.office.payment.webhook.google;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class TestNotification {
+    /**
+     * 通知的版本。最初,此值为“1.0”。此版本与其他版本字段不同。
+     */
+    private String version;
+
+    /**
+     * 订阅的 notificationType 可以具有以下值:
+     * (1) SUBSCRIPTION_RECOVERED - 从帐号保留状态恢复了订阅。
+     * (2) SUBSCRIPTION_RENEWED - 续订了处于活动状态的订阅。
+     * (3) SUBSCRIPTION_CANCELED - 自愿或非自愿地取消了订阅。如果是自愿取消,在用户取消时发送。
+     * (4) SUBSCRIPTION_PURCHASED - 购买了新的订阅。
+     * (5) SUBSCRIPTION_ON_HOLD - 订阅已进入帐号保留状态(如果已启用)。
+     * (6) SUBSCRIPTION_IN_GRACE_PERIOD - 订阅已进入宽限期(如果已启用)。
+     * (7) SUBSCRIPTION_RESTARTED - 用户已通过 Play > 帐号 > 订阅恢复了订阅。订阅已取消,但在用户恢复时尚未到期。如需了解详情,请参阅恢复。
+     * (8) SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 用户已成功确认订阅价格变动。
+     * (9) SUBSCRIPTION_DEFERRED - 订阅的续订时间点已延期。
+     * (10) SUBSCRIPTION_PAUSED - 订阅已暂停。
+     * (11) SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED - 订阅暂停计划已更改。
+     * (12) SUBSCRIPTION_REVOKED - 用户在到期时间之前已撤消订阅。
+     * (13) SUBSCRIPTION_EXPIRED - 订阅已到期。
+     */
+    private int notificationType;
+
+    /**
+     * 购买订阅时向用户设备提供的令牌。
+     */
+    private String purchaseToken;
+
+    /**
+     * 所购买订阅的商品 ID(例如“monthly001”)。
+     */
+    private String subscriptionId;
+}

+ 6 - 0
pdf-office-payment/src/main/resources/mapper/SubscriptionsMapper.xml

@@ -53,6 +53,12 @@
 
           AND s.user_id = #{userId}
     </select>
+    <select id="countSubscription"  resultType="int">
+        SELECT COUNT(*)
+        FROM subscription s
+                 LEFT JOIN product p ON s.product_id = p.id
+        WHERE s.user_id = #{userId}
+    </select>
     <select id="countAdvancedSubscriptions" resultMap="SubscriptionsResultMap">
         SELECT s.*,p.code
         FROM subscription s

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

@@ -139,7 +139,6 @@ public class LotteryServiceImpl implements LotteryService {
         PrizeVO prizeVO = new PrizeVO();
         prizeVO.setUserId(userId);
         //全平台高级版可用
-        prizeVO.setProductId(productApi.getProductByCode("advanced-annual-subscription").getResult().getId());
         prizeVO.setType(PrizeTypeEnum.COUPON.getCode());
         prizeVO.setCode(getUpperCaseSubstringFromUUID(14));
         prizeVO.setStartDate(new Date());

+ 2 - 1
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/controller/PrizeController.java

@@ -11,6 +11,7 @@ import cn.kdan.cloud.pdf.office.product.service.PrizeService;
 import cn.kdan.cloud.pdf.office.product.service.ProductService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -46,7 +47,7 @@ public class PrizeController {
         List<PrizeVO> result = new ArrayList<>();
         for (Prize item : list) {
             PrizeVO prizeVO = new PrizeVO();
-            if(item.getProductId()!= null) {
+            if(StringUtils.isNotEmpty(item.getProductId())) {
                 prizeVO.setProductCode(productService.getProduct(item.getProductId()).getCode());
             }
             BeanUtils.copyProperties(item, prizeVO);

+ 1 - 1
pdf-office-product/src/main/java/cn/kdan/cloud/pdf/office/product/entity/Prize.java

@@ -71,6 +71,6 @@ public class Prize extends BaseEntity{
     /**
      * 已使用的优惠券关联订单
      */
-    private Integer orderId;
+    private String orderId;
 
 }

+ 11 - 7
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/controller/UserCenterController.java

@@ -3,19 +3,15 @@ package cn.kdan.cloud.pdf.office.sso.controller;
 import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
 import cn.kdan.cloud.pdf.office.api.email.bo.EmailSendBO;
 import cn.kdan.cloud.pdf.office.api.email.feign.EmailApi;
-import cn.kdan.cloud.pdf.office.api.payment.feign.SubscriptionApi;
 import cn.kdan.cloud.pdf.office.api.product.feign.PrizeApi;
-import cn.kdan.cloud.pdf.office.api.product.feign.ProductApi;
 import cn.kdan.cloud.pdf.office.api.product.vo.PrizeVO;
 import cn.kdan.cloud.pdf.office.common.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.enums.EmailCodeTypeEnum;
 import cn.kdan.cloud.pdf.office.common.enums.ExceptionEnum;
 import cn.kdan.cloud.pdf.office.common.enums.ValidStatusEnum;
-import cn.kdan.cloud.pdf.office.common.enums.account.PayTypeEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.common.pojo.CustomUserDetails;
 import cn.kdan.cloud.pdf.office.common.pojo.ResultMap;
-import cn.kdan.cloud.pdf.office.common.utils.MyDateUtils;
 import cn.kdan.cloud.pdf.office.common.vo.SimpleUserSubscriptionInfoVO;
 import cn.kdan.cloud.pdf.office.common.vo.UserInfoVO;
 import cn.kdan.cloud.pdf.office.common.vo.UserVO;
@@ -34,6 +30,7 @@ import java.security.Principal;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -89,10 +86,12 @@ public class UserCenterController {
         AccountRightVO result = new AccountRightVO();
         List<SimpleUserSubscriptionInfoVO> resultList = new ArrayList<>();
         AtomicInteger totalAiPoints = new AtomicInteger(); // 用于累积AI用户的点数
-
+        AtomicBoolean isUpgrade = new AtomicBoolean(false);
         user.getSubscriptionInfoList().stream().forEach(item -> {
             item.setPlatforms(convertToLowerCase(item.getPlatforms()));
-
+            if(item.getCode().contains("upgrade")){
+                isUpgrade.set(true);
+            }
             // 没有购买显示当前时间
             if (ObjectUtils.isEmpty(item.getEndDate())) {
                 item.setEndDate(new Date());
@@ -114,7 +113,12 @@ public class UserCenterController {
             }
         });
 
-
+        if (isUpgrade.get()) {
+            resultList.removeIf(info -> Objects.equals(info.getPlatforms(), "3")); // 通过 removeIf 来移除 level 为 0 的记录
+        }
+        if (resultList.size() > 1) {
+            resultList.removeIf(info -> Objects.equals(info.getLevels(), "1")); // 通过 removeIf 来移除 level 为 0 的记录
+        }
         result.setVipList(resultList);
         result.setAiPoint(totalAiPoints.get());
         //Todo

+ 32 - 0
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/controller/UserController.java

@@ -3,12 +3,14 @@ package cn.kdan.cloud.pdf.office.sso.controller;
 import cn.kdan.cloud.pdf.office.api.account.feign.UserApi;
 import cn.kdan.cloud.pdf.office.api.payment.dto.CreateSubscriptionDTO;
 import cn.kdan.cloud.pdf.office.api.payment.enums.PaymentMethodEnum;
+import cn.kdan.cloud.pdf.office.api.payment.feign.OrderApi;
 import cn.kdan.cloud.pdf.office.api.payment.feign.SubscriptionApi;
 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.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.enums.ValidStatusEnum;
 import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserStatusEnum;
+import cn.kdan.cloud.pdf.office.common.enums.account.PDFOfficeUserSubscriptionStatusEnum;
 import cn.kdan.cloud.pdf.office.common.enums.account.PayTypeEnum;
 import cn.kdan.cloud.pdf.office.common.enums.payment.SubscriptionTypeEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
@@ -21,6 +23,7 @@ import cn.kdan.cloud.pdf.office.sso.service.AuthService;
 import cn.kdan.cloud.pdf.office.sso.utils.RSAUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -33,6 +36,10 @@ import java.security.Principal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 /**
@@ -50,9 +57,17 @@ public class UserController {
     @Autowired
     private SubscriptionApi subscriptionApi;
     @Autowired
+    private OrderApi orderApi;
+    @Autowired
     private AuthService authService;
     @Value("${avatarUrl}")
     private String avatarUrl;
+    private static final ThreadPoolExecutor PAY_UPDATE_THREAD_POOL = new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors(),
+            Runtime.getRuntime().availableProcessors(),
+            1L,
+            TimeUnit.MINUTES,
+            new LinkedBlockingQueue<>(300), new ThreadFactoryBuilder()
+            .setNameFormat("PAY_NOTIFY_THREAD_POOL").build(), new ThreadPoolExecutor.AbortPolicy());
 
     public static String convertToLowerCase(String input) {
         if (input == null || input.isEmpty()) {
@@ -155,6 +170,12 @@ public class UserController {
                 BeanUtils.copyProperties(activeSubscription,vo);
                 result.setActiveVIP(vo);
                 vo.setPlatforms(convertToLowerCase(vo.getPlatforms()));
+                if(activeSubscription.getStatus().equals(PDFOfficeUserSubscriptionStatusEnum.SUBSCRIPTION_IN_PROGRESS.value())
+                        &&activeSubscription.getPlatform().equals(2)) {
+                    PAY_UPDATE_THREAD_POOL.submit(() -> {
+                        orderApi.updateStatusPayment(userId, activeSubscription.getProductId());
+                    });
+                }
                 result.setAiPoint(authService.getAiPoints(user.getSubscriptionInfoList()));
                 SimpleUserSubscriptionInfoVO aiInfo = new SimpleUserSubscriptionInfoVO();
                 UserSubscriptionInfoVO infoVO = authService.getActiveAi(user.getSubscriptionInfoList());
@@ -164,6 +185,7 @@ public class UserController {
                 return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS, result);
             }
         }
+
         throw new BackendRuntimeException("net error");
     }
 
@@ -179,7 +201,11 @@ public class UserController {
                 String userId = ((CustomUserDetails) ((OAuth2Authentication) principal).getPrincipal()).getId();
                 // 获取用户的基本信息
                 UserInfoVO user = userApi.getMemberInfoById(userId).getResult();
+                AtomicBoolean isUpgrade = new AtomicBoolean(false);
                 List<SimpleUserSubscriptionInfoVO> resultList = user.getSubscriptionInfoList().stream().map(item -> {
+                    if(item.getCode().contains("upgrade")){
+                        isUpgrade.set(true);
+                    }
                     //自动续订,显示续订日期
                     if (!ObjectUtils.isEmpty(item.getEndDate()) && PayTypeEnum.AUTO.value().equals(item.getPayType())) {
                         LocalDateTime payTime = subscriptionApi.getNextPayTime(item.getUserId(), item.getProductId()).getResult();
@@ -200,6 +226,12 @@ public class UserController {
                     BeanUtils.copyProperties(item, vo);
                     return vo;
                 }).collect(Collectors.toList());
+                if (isUpgrade.get()) {
+                    resultList.removeIf(info -> Objects.equals(info.getPlatforms(), "3")); // 通过 removeIf 来移除 level 为 0 的记录
+                }
+                if (resultList.size() > 1) {
+                    resultList.removeIf(info -> StringUtils.isNotEmpty(info.getLevels())&&Objects.equals(info.getLevels(), "1")); // 通过 removeIf 来移除 level 为 0 的记录
+                }
                 return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS, resultList);
             }
         }

+ 3 - 3
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/service/impl/AuthServiceImpl.java

@@ -414,8 +414,8 @@ public class AuthServiceImpl implements AuthService {
         //如果检查邮件验证码
         if(!StringUtils.isEmpty(loginParam.getCode())){
             //检查用户存在,如果不存在的话对用户进行注册(如果是验证码注册则对用户自动注册,密码为空)
-            userVO = checkUserAndAutoRegister(userVO,loginParam);
             checkEmailCodeValid(EmailCodeTypeEnum.MEMBER_LOGIN,loginParam.getEmail(),loginParam.getCode(),loginParam.getAppId());
+            userVO = checkUserAndAutoRegister(userVO,loginParam);
         }
         if(!StringUtils.isEmpty(loginParam.getPassword())){
             checkUser(userVO);
@@ -503,10 +503,10 @@ public class AuthServiceImpl implements AuthService {
             if(StringUtils.isNotEmpty(loginParam.getInviteUserId())){
                 processInvite(loginParam.getInviteUserId());
             }
+            //注册给用户发送邮件
+            sendRegisterEmail();
             return userVO;
         }
-        //注册给用户发送邮件
-        sendRegisterEmail();
         throw new BackendRuntimeException(ExceptionEnum.EMAIL_REGISTER_ERROR);
     }