Browse Source

feat: 种子价用户标识 - profile接口返回isSeedPriceUser

- OrderRepository新增countByUserIdAndIsSeedPriceAndStatus

- UserService新增isSeedPriceUser方法

- ProfileController返回isSeedPriceUser字段
liaoxg 3 months ago
parent
commit
87c6b1e596

+ 1 - 0
num-server/src/main/java/com/etotem/num/controller/ProfileController.java

@@ -45,6 +45,7 @@ public class ProfileController {
         info.put("isAdmin", user.getIsAdmin());
         info.put("vipEndTime", user.getVipEndTime());
         info.put("isVip", userService.isVip(userId));
+        info.put("isSeedPriceUser", userService.isSeedPriceUser(userId));
         info.put("dailyChartCount", user.getDailyChartCount());
         info.put("dailyChatCount", user.getDailyChatCount());
         // US-5.1 profile fields

+ 2 - 0
num-server/src/main/java/com/etotem/num/repository/OrderRepository.java

@@ -15,4 +15,6 @@ public interface OrderRepository extends JpaRepository<Order, Long> {
     Optional<Order> findByUserIdAndProductTypeAndStatusOrderByPaidAtDesc(Long userId, String productType, String status);
     // US-4.2: Count seed price orders for seed price availability check
     long countByIsSeedPriceAndProductTypeAndStatus(Boolean isSeedPrice, String productType, String status);
+    // US-4.3: Check if a specific user has any paid seed price order
+    long countByUserIdAndIsSeedPriceAndStatus(Long userId, Boolean isSeedPrice, String status);
 }

+ 13 - 1
num-server/src/main/java/com/etotem/num/service/UserService.java

@@ -3,6 +3,7 @@ package com.etotem.num.service;
 import com.etotem.num.common.BizException;
 import com.etotem.num.config.JwtConfig;
 import com.etotem.num.entity.User;
+import com.etotem.num.repository.OrderRepository;
 import com.etotem.num.repository.UserRepository;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -17,11 +18,14 @@ public class UserService {
     private final UserRepository userRepository;
     private final JwtConfig jwtConfig;
     private final ConfigService configService;
+    private final OrderRepository orderRepository;
 
-    public UserService(UserRepository userRepository, JwtConfig jwtConfig, ConfigService configService) {
+    public UserService(UserRepository userRepository, JwtConfig jwtConfig, ConfigService configService,
+                       OrderRepository orderRepository) {
         this.userRepository = userRepository;
         this.jwtConfig = jwtConfig;
         this.configService = configService;
+        this.orderRepository = orderRepository;
     }
 
     /**
@@ -192,6 +196,14 @@ public class UserService {
         return user;
     }
 
+    /**
+     * US-4.3 §19: Check whether the user has ever purchased at seed price.
+     * Returns true if the user has at least one paid order with isSeedPrice=true.
+     */
+    public boolean isSeedPriceUser(Long userId) {
+        return orderRepository.countByUserIdAndIsSeedPriceAndStatus(userId, true, "paid") > 0;
+    }
+
     // US-6.1 §2: 6位大写字母+数字, 去掉易混淆 O/0/I/1
     private static final String RC_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
     private static final int RC_LENGTH = 6;