licailing há 3 anos atrás
pai
commit
8563fef535

+ 2 - 0
src/main/java/com/izouma/nineth/config/RedisKeys.java

@@ -11,4 +11,6 @@ public class RedisKeys {
 
     public static final String PAY_RECORD = "payRecord::";
 
+    public static final String CREATE_MINT_ORDER = "createMintOrder::";
+
 }

+ 9 - 0
src/main/java/com/izouma/nineth/repo/MintActivityRepo.java

@@ -25,4 +25,13 @@ public interface MintActivityRepo extends JpaRepository<MintActivity, Long>, Jpa
     void addStock(Long id);
 
     List<MintActivity> findAllByIdInAndDelFalse(Collection<Long> id);
+
+    @Query("select c.stock from MintActivity c where c.id = ?1")
+    Integer getStock(Long id);
+
+    @Query("update Collection c set c.stock = ?2 where c.id = ?1")
+    @Transactional
+    @Modifying
+    int updateStock(Long id, int stock);
+
 }

+ 8 - 0
src/main/java/com/izouma/nineth/service/CacheService.java

@@ -13,6 +13,14 @@ public class CacheService {
     public void clearCollection(Long id) {
     }
 
+    @CacheEvict(value = "mintActivity", allEntries = true)
+    public void clearMintActivity() {
+    }
+
+    @CacheEvict(value = "mintActivity", key = "#id")
+    public void clearMintActivity(Long id) {
+    }
+
     @CacheEvict(value = "user", allEntries = true)
     public void clearUser() {
     }

+ 52 - 1
src/main/java/com/izouma/nineth/service/MintActivityService.java

@@ -1,20 +1,71 @@
 package com.izouma.nineth.service;
 
+import com.izouma.nineth.annotations.Debounce;
 import com.izouma.nineth.domain.MintActivity;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.repo.MintActivityRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
+import org.springframework.data.redis.core.BoundValueOperations;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
 @Service
 @AllArgsConstructor
 public class MintActivityService {
 
-    private MintActivityRepo mintActivityRepo;
+    private MintActivityRepo              mintActivityRepo;
+    private RedisTemplate<String, Object> redisTemplate;
+    private CacheService                  cacheService;
 
     public Page<MintActivity> all(PageQuery pageQuery) {
         return mintActivityRepo.findAll(JpaUtils.toSpecification(pageQuery, MintActivity.class), JpaUtils.toPageRequest(pageQuery));
     }
+
+    public synchronized Long increaseStock(Long id, int number) {
+        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps("mintActivityStock::" + id);
+        if (ops.get() == null) {
+            Boolean success = ops.setIfAbsent(Optional.ofNullable(mintActivityRepo.getStock(id))
+                    .orElse(0), 7, TimeUnit.DAYS);
+            log.info("创建redis铸造活动库存:{}", success);
+        }
+        Long stock = ops.increment(number);
+        return stock;
+    }
+
+    public synchronized Long decreaseStock(Long id, int number) {
+        return increaseStock(id, -number);
+    }
+
+    public synchronized Long increaseSale(Long id, int number) {
+        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps("mintActivitySale::" + id);
+        if (ops.get() == null) {
+            Boolean success = ops.setIfAbsent(Optional.ofNullable(mintActivityRepo.getStock(id))
+                    .orElse(0), 7, TimeUnit.DAYS);
+            log.info("创建redis铸造活动销量:{}", success);
+        }
+        Long sale = ops.increment(number);
+        return sale;
+    }
+
+    public synchronized Long decreaseSale(Long id, int number) {
+        return increaseStock(id, -number);
+    }
+
+    @Debounce(key = "#id", delay = 500)
+    public void syncStock(Long id) {
+        Integer stock = (Integer) redisTemplate.opsForValue().get("mintActivityStock::" + id);
+        if (stock != null) {
+            log.info("同步铸造活动库存信息{}", id);
+            mintActivityRepo.updateStock(id, stock);
+            cacheService.clearMintActivity(id);
+        }
+    }
+
 }

+ 24 - 17
src/main/java/com/izouma/nineth/service/MintOrderService.java

@@ -49,19 +49,20 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class MintOrderService {
 
-    private MintOrderRepo     mintOrderRepo;
-    private UserRepo          userRepo;
-    private AssetService      assetService;
-    private AssetRepo         assetRepo;
-    private MintActivityRepo  mintActivityRepo;
-    private UserAddressRepo   userAddressRepo;
-    private GeneralProperties generalProperties;
-    private Environment       env;
-    private AdapayProperties  adapayProperties;
-    private SnowflakeIdWorker snowflakeIdWorker;
-    private WxPayProperties   wxPayProperties;
-    private WxPayService      wxPayService;
-    private MintMaterialRepo  mintMaterialRepo;
+    private MintOrderRepo       mintOrderRepo;
+    private UserRepo            userRepo;
+    private AssetService        assetService;
+    private AssetRepo           assetRepo;
+    private MintActivityRepo    mintActivityRepo;
+    private UserAddressRepo     userAddressRepo;
+    private GeneralProperties   generalProperties;
+    private Environment         env;
+    private AdapayProperties    adapayProperties;
+    private SnowflakeIdWorker   snowflakeIdWorker;
+    private WxPayProperties     wxPayProperties;
+    private WxPayService        wxPayService;
+    private MintMaterialRepo    mintMaterialRepo;
+    private MintActivityService mintActivityService;
 
     public Page<MintOrder> all(PageQuery pageQuery) {
         return mintOrderRepo.findAll(JpaUtils.toSpecification(pageQuery, MintOrder.class), JpaUtils.toPageRequest(pageQuery));
@@ -148,7 +149,10 @@ public class MintOrderService {
         MintActivity mintActivity = mintActivityRepo.findByIdAndDelFalse(mintActivityId)
                 .orElseThrow(new BusinessException("无此铸造活动"));
 
-        if (mintActivity.getStock() <= 0) {
+        int stock = Optional.ofNullable(mintActivityService.decreaseStock(mintActivityId, 1))
+                .map(Math::toIntExact)
+                .orElseThrow(new BusinessException("很遗憾,藏品已售罄"));
+        if (stock < 0) {
             throw new BusinessException("铸造活动已无库存");
         }
 
@@ -255,8 +259,10 @@ public class MintOrderService {
         mintMaterialRepo.saveAll(materials);
 
         //库存
-        mintActivity.setStock(mintActivity.getStock() - 1);
-        mintActivityRepo.save(mintActivity);
+
+//        mintActivity.setStock(mintActivity.getStock() - 1);
+//        mintActivityRepo.save(mintActivity);
+        mintActivityService.increaseSale(mintActivityId, 1);
         return mintOrder;
     }
 
@@ -438,6 +444,7 @@ public class MintOrderService {
         mintOrderRepo.save(order);
 
         // 加库存
-        mintActivityRepo.addStock(order.getMintActivityId());
+//        mintActivityRepo.addStock(order.getMintActivityId());
+        mintActivityService.increaseStock(order.getMintActivityId(), 1);
     }
 }

+ 8 - 1
src/test/java/com/izouma/nineth/service/AssetServiceTest.java

@@ -140,10 +140,17 @@ class AssetServiceTest extends ApplicationTests {
     public void all() {
         PageQuery pageQuery = new PageQuery();
         Map<String, Object> query = pageQuery.getQuery();
-        query.put("userId", 9850);
+        query.put("userId", 7372);
         assetService.all(pageQuery)
                 .getContent()
                 .forEach(asset -> System.out.println(asset.getId() + "->" + asset.isOpened()));
     }
 
+    @Test
+    public void get(){
+        Asset asset = assetRepo.findById(2366705L).orElseThrow(new BusinessException("无记录"));
+        orderRepo.findByIdAndDelFalse(asset.getOrderId()).ifPresent(order -> asset.setOpened(order.isOpened()));
+        System.out.println(asset);
+    }
+
 }

+ 17 - 0
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -241,4 +241,21 @@ public class OrderServiceTest extends ApplicationTests {
                     }
                 });
     }
+
+    @Test
+    public void test() {
+        orderService.create(9850L, 196308L, 1, null, null, null,
+                945378720611303424L, true, 2);
+    }
+
+    @Test
+    public void test1() {
+        orderService.queryCreateOrder("945378720611303424");
+    }
+
+    @Test
+    public void test2() {
+        System.out.println(orderRepo.countByUserIdAndCollectionIdAndVipTrueAndStatusIn(9850L, 196308L,
+                Arrays.asList(OrderStatus.FINISH, OrderStatus.NOT_PAID, OrderStatus.PROCESSING)));
+    }
 }