Browse Source

Merge branch 'dev' of xiongzhu/art-trade-2 into master

wuyi 2 năm trước cách đây
mục cha
commit
54afdef66e

+ 15 - 1
src/main/java/com/izouma/awesomeAdmin/service/ProductService.java

@@ -26,6 +26,7 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -95,7 +96,7 @@ public class ProductService {
         return product;
     }
 
-    public Page<Product> list(String search, Long batchId, List<ProductStatus> statuses, Pageable pageable) {
+    public Page<Product> list(String search, Long batchId, List<ProductStatus> statuses, Pageable pageable, Long userId) {
         SaleBatch saleBatch = saleBatchRepo.findById(batchId).orElseThrow(new BusinessException("分类不存在"));
         LocalTime now = LocalTime.now();
         if (!saleBatch.getEnabled()
@@ -107,6 +108,7 @@ public class ProductService {
             statuses = Collections.singletonList(ProductStatus.IN_STOCK);
         }
         boolean hideSelfProduct = sysConfigService.getBoolean("hide_self_product");
+
         List<ProductStatus> finalStatuses = statuses;
         return productRepo.findAll((Specification<Product>) (root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> predicates = new ArrayList<>();
@@ -128,6 +130,18 @@ public class ProductService {
                 ));
             }
 
+            if (userId != null) {
+                User user = userRepo.findById(userId).orElseThrow(new BusinessException(Translator.toLocale("user.not_found")));
+                BigDecimal period = sysConfigService.getBigDecimal("freshness_period_for_new");
+                if (new BigDecimal(ChronoUnit.DAYS.between(user.getCreatedAt(), LocalDateTime.now())).compareTo(period) < 1) {
+                    BigDecimal newUserMax = sysConfigService.getBigDecimal("new_user_max");
+                    predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("currentPrice"), newUserMax));
+                } else {
+                    BigDecimal oldUserMin = sysConfigService.getBigDecimal("old_user_min");
+                    predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("currentPrice"), oldUserMin));
+                }
+            }
+
             return criteriaQuery.where(predicates.toArray(new Predicate[0]))
                                 .getRestriction();
         }, pageable);

+ 24 - 6
src/main/java/com/izouma/awesomeAdmin/service/VipService.java

@@ -5,10 +5,7 @@ import com.izouma.awesomeAdmin.domain.*;
 import com.izouma.awesomeAdmin.dto.PageQuery;
 import com.izouma.awesomeAdmin.enums.ProductStatus;
 import com.izouma.awesomeAdmin.exception.BusinessException;
-import com.izouma.awesomeAdmin.repo.UserVipRepo;
-import com.izouma.awesomeAdmin.repo.VipConfigRepo;
-import com.izouma.awesomeAdmin.repo.VipPurchaseRepo;
-import com.izouma.awesomeAdmin.repo.VipTypeRepo;
+import com.izouma.awesomeAdmin.repo.*;
 import com.izouma.awesomeAdmin.utils.Translator;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +22,7 @@ import javax.transaction.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -49,6 +47,7 @@ public class VipService {
     private VipAsyncService    vipAsyncService;
     private RedissonClient     redissonClient;
     private SysConfigService   sysConfigService;
+    private UserRepo           userRepo;
 
     @Transactional
     public void purchaseVip(Long userId, Long vipTypeId, Long vipConfigId, int num) {
@@ -140,7 +139,7 @@ public class VipService {
         try {
             log.info("🚚 schedule");
             List<Product> list = productService.list(null, 11548L, Collections.singletonList(ProductStatus.IN_STOCK),
-                                                       PageRequest.ofSize(100).withSort(Sort.by("modifiedAt").descending()))
+                                                       PageRequest.ofSize(100).withSort(Sort.by("modifiedAt").descending()), null)
                                                .getContent().stream()
                                                .filter(product -> product.getDelayTo() == null
                                                        || product.getDelayTo().isBefore(LocalDateTime.now()))
@@ -149,6 +148,11 @@ public class VipService {
                 log.info("🚚 schedule, no product");
                 return;
             }
+
+            BigDecimal period = sysConfigService.getBigDecimal("freshness_period_for_new");
+            BigDecimal newUserMax = sysConfigService.getBigDecimal("new_user_max");
+            BigDecimal oldUserMin = sysConfigService.getBigDecimal("old_user_min");
+
             for (int i = 10; i < list.size(); i++) {
                 Product product = list.get(i);
                 List<UserVip> vips = userVipRepo.findMatchVip(product.getCurrentPrice(), product.getUserId());
@@ -156,8 +160,22 @@ public class VipService {
                     continue;
                 }
                 UserVip chosenVip = vips.get(new Random().nextInt(vips.size()));
+
+                User user = userRepo.findById(chosenVip.getUserId()).orElseThrow(new BusinessException(Translator.toLocale("user.not_found")));
+                BigDecimal intervals = new BigDecimal(ChronoUnit.DAYS.between(user.getCreatedAt(), LocalDateTime.now()));
+
                 try {
-                    vipAsyncService.autoTrade(chosenVip, product);
+                    if (intervals.compareTo(period) < 1) {
+                        //new
+                        if (product.getCurrentPrice().compareTo(newUserMax) < 1) {
+                            vipAsyncService.autoTrade(chosenVip, product);
+                        }
+                    } else {
+                        //old
+                        if (oldUserMin.compareTo(product.getCurrentPrice()) < 1) {
+                            vipAsyncService.autoTrade(chosenVip, product);
+                        }
+                    }
                 } catch (Exception e) {
                     log.error("🚚 auto trade error", e);
                 }

+ 2 - 1
src/main/java/com/izouma/awesomeAdmin/web/ProductController.java

@@ -7,6 +7,7 @@ import com.izouma.awesomeAdmin.dto.PageQuery;
 import com.izouma.awesomeAdmin.exception.BusinessException;
 import com.izouma.awesomeAdmin.repo.ProductRepo;
 import com.izouma.awesomeAdmin.utils.ObjUtils;
+import com.izouma.awesomeAdmin.utils.SecurityUtils;
 import com.izouma.awesomeAdmin.utils.Translator;
 import com.izouma.awesomeAdmin.utils.excel.ExcelUtils;
 import io.swagger.annotations.*;
@@ -88,7 +89,7 @@ public class ProductController extends BaseController {
         if (StringUtils.isNotEmpty(statuses)) {
             list = Arrays.stream(statuses.split(",")).map(ProductStatus::valueOf).collect(Collectors.toList());
         }
-        return productService.list(search, batchId, list, toPageRequest(pageQuery));
+        return productService.list(search, batchId, list, toPageRequest(pageQuery), SecurityUtils.getAuthenticatedUser().getId());
     }
 
     @GetMapping("/reserveCount")

+ 1 - 1
src/main/vue-admin/src/views/UserVipList.vue

@@ -43,7 +43,7 @@
 <!--                    <el-table-column prop="autoTradeEnabled" label="自动交易"
 >
                     </el-table-column>-->
-                    <el-table-column prop="todayUsed" label="剩余购买次数"
+                    <el-table-column prop="todayUsed" label="购买次数"
 >
                     </el-table-column>
                     <el-table-column prop="dailyLimit" label="每天购买次数"