فهرست منبع

调整用户持仓

sunkean 3 سال پیش
والد
کامیت
4931b3dd74

+ 0 - 3
src/main/java/com/izouma/nineth/config/CacheConfig.java

@@ -142,9 +142,6 @@ public class CacheConfig {
         cacheNamesConfigurationMap.put("blindBoxRare", RedisCacheConfiguration.defaultCacheConfig()
                 .entryTtl(Duration.ofSeconds(2))
                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
-        cacheNamesConfigurationMap.put("userHoldList", RedisCacheConfiguration.defaultCacheConfig()
-                .entryTtl(Duration.ofHours(1))
-                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
 
         RedisCacheManager redisCacheManager = RedisCacheManager.builder()
                 .cacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory()))

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

@@ -23,6 +23,8 @@ public interface Constants {
 
     String ALIPAY_URL_SCHEME = "alipays://platformapi/startapp?saId=10000007&qrcode=";
 
+    String USER_HOLD_CACHE_KEY = "userHoldList";
+
     interface PayChannel {
         String SAND = "sandPay";
         String HM   = "hmPay";

+ 1 - 7
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -104,15 +104,9 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
     List<Asset> findAllByUserIdAndTypeAndOpened(Long userId, CollectionType type, Boolean opened);
 
-    @Query(nativeQuery = true, value = "SELECT asset.user_id userId,user.nickname nickname,user.username username,user.avatar avatar,asset.name,asset.prefix_name prefixName,count(*) num FROM asset left join user on asset.user_id = user.id where asset.user_id not in (1435297,4273750, 56302) and asset.status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING') GROUP BY asset.user_id ORDER BY count(*) DESC limit ?1,?2")
-    List<Map<String, String>> findByPage(int start, int end);
-
-    @Query(nativeQuery = true, value = "SELECT asset.user_id userId,user.nickname nickname,user.username username,user.avatar avatar,asset.name,asset.prefix_name prefixName,count(*) num FROM asset left join user on asset.user_id = user.id where asset.user_id not in (1435297,4273750, 56302) and asset.status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING') GROUP BY asset.user_id")
+    @Query(nativeQuery = true, value = "SELECT * FROM (SELECT asset.user_id userId,user.nickname nickname,user.username username,user.avatar avatar,asset.name,asset.prefix_name prefixName,count(*) num FROM asset left join user on asset.user_id = user.id where asset.user_id not in (1435297,4273750, 56302) and asset.status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING') GROUP BY asset.user_id) a WHERE a.num > 10")
     List<Map<String, String>> findAllUserHold();
 
-    @Query(nativeQuery = true, value = "SELECT count(distinct user_id) FROM asset where status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING') ")
-    int totalElements();
-
     List<Asset> findAllByUserIdAndStatusIn(Long userId, List<AssetStatus> status);
 
     @Query("select a from Asset a where a.status in (com.izouma.nineth.enums.AssetStatus.NORMAL,com.izouma.nineth.enums.AssetStatus.TRADING,com.izouma.nineth.enums.AssetStatus.GIFTING,com.izouma.nineth.enums.AssetStatus.MINTING,com.izouma.nineth.enums.AssetStatus.AUCTIONING) and a.userId = ?1 and a.name like ?2")

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

@@ -131,4 +131,8 @@ public class CacheService {
     public void clearAuction(Long id) {
     }
 
+    @CacheEvict(value = "userHoldList", allEntries = true)
+    public void clearUserHold() {
+    }
+
 }

+ 94 - 0
src/main/java/com/izouma/nineth/service/UserHoldCountCache.java

@@ -0,0 +1,94 @@
+package com.izouma.nineth.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.dto.UserHoldDTO;
+import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.CollectionRepo;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+@AllArgsConstructor
+public class UserHoldCountCache {
+
+    private CollectionRepo collectionRepo;
+
+    private AssetRepo assetRepo;
+
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public void allUserHold() {
+        Map<String, BigDecimal> minPriceMap = new HashMap<>();
+        List<Map<String, String>> assets = assetRepo.findAllUserHold();
+        JSONArray jsonArray = new JSONArray();
+        jsonArray.addAll(assets);
+        List<UserHoldDTO> userHoldDTOS = jsonArray.toJavaList(UserHoldDTO.class);
+        userHoldDTOS.forEach(userHoldDTO -> {
+            List<Asset> userAssets = assetRepo.findAllByUserIdAndStatusIn(userHoldDTO.getUserId(), new ArrayList<>(Arrays.asList(AssetStatus.NORMAL, AssetStatus.TRADING, AssetStatus.GIFTING, AssetStatus.MINTING, AssetStatus.AUCTIONING)));
+            // 分类计算各资产寄售最低价
+            userAssets.forEach(asset -> {
+                if (StringUtils.isBlank(asset.getPrefixName())) {
+                    return;
+                }
+                if (asset.getName().contains(Constants.Rarity.SR_LIKE) && !asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
+                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SR_LIKE, Constants.Rarity.SSR_LIKE);
+                    return;
+                }
+                if (asset.getName().contains(Constants.Rarity.U_LIKE)) {
+                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.U_LIKE, Constants.Rarity.R_LIKE);
+                    return;
+                }
+                if (asset.getName().contains(Constants.Rarity.R_LIKE) && !asset.getName().contains(Constants.Rarity.SR_LIKE)) {
+                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.R_LIKE, Constants.Rarity.SR_LIKE);
+                    return;
+                }
+                if (asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
+                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SSR_LIKE, Constants.Rarity.U_LIKE);
+                    return;
+                }
+                calculatePrice(userHoldDTO, asset, minPriceMap, null, null);
+            });
+        });
+        if (CollectionUtils.isNotEmpty(userHoldDTOS)) {
+            userHoldDTOS.sort(Comparator.comparing(UserHoldDTO::getPrice).reversed());
+        }
+        redisTemplate.opsForValue().set(Constants.USER_HOLD_CACHE_KEY, userHoldDTOS);
+    }
+
+    private void calculatePrice(UserHoldDTO userHoldDTO, Asset asset, Map<String, BigDecimal> minPriceMap, String nameLike, String nameNotLike) {
+        BigDecimal minPrice;
+        String minPriceMapKey = StringUtils.isBlank(nameLike) ? asset.getPrefixName() : asset.getPrefixName().concat(nameLike);
+        if (minPriceMap.containsKey(minPriceMapKey)) {
+            minPrice = minPriceMap.get(minPriceMapKey);
+        } else {
+            // 该系列寄售最低价
+            if (StringUtils.isBlank(nameLike)) {
+                minPrice = collectionRepo.findMinPriceByPrefixName(asset.getPrefixName());
+            } else {
+                minPrice = collectionRepo.findMinPriceByNameAndPrefixName(asset.getPrefixName(), nameLike, nameNotLike);
+            }
+            // 该系列没有寄售的话取originalPrice
+            if (Objects.isNull(minPrice)) {
+                Collection collection = collectionRepo.findById(asset.getCollectionId()).orElse(null);
+                if (Objects.isNull(collection)) {
+                    minPrice = BigDecimal.ZERO;
+                } else {
+                    minPrice = collection.getOriginalPrice();
+                }
+            }
+//            minPrice = Objects.isNull(minPrice) ? BigDecimal.ZERO : minPrice;
+            minPriceMap.put(minPriceMapKey, minPrice);
+        }
+        userHoldDTO.setPrice(userHoldDTO.getPrice().add(minPrice));
+    }
+}

+ 22 - 83
src/main/java/com/izouma/nineth/service/UserHoldCountService.java

@@ -1,107 +1,46 @@
 package com.izouma.nineth.service;
 
-import cn.hutool.core.collection.CollUtil;
-import com.alibaba.fastjson.JSONArray;
 import com.izouma.nineth.config.Constants;
-import com.izouma.nineth.domain.Asset;
-import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageWrapper;
 import com.izouma.nineth.dto.UserHoldDTO;
-import com.izouma.nineth.enums.AssetStatus;
-import com.izouma.nineth.repo.AssetRepo;
-import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.exception.BusinessException;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.cache.annotation.Cacheable;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 @AllArgsConstructor
 public class UserHoldCountService {
+    private RedisTemplate<String, Object> redisTemplate;
 
-    private AssetRepo assetRepo;
-
-    private CollectionRepo collectionRepo;
-
-//    @Cacheable(value = "userHoldList", key = "#pageQuery.hashCode()")
     public PageWrapper<UserHoldDTO> all(PageQuery pageQuery) {
+        if (Boolean.FALSE.equals(redisTemplate.hasKey(Constants.USER_HOLD_CACHE_KEY))) {
+            throw new BusinessException("key失效,请刷新!如果已经刷新,请等待!");
+        }
         int page = pageQuery.getPage();
         int size = pageQuery.getSize();
         int start = page * size;
-        int totalElements = assetRepo.totalElements();
-        List<UserHoldDTO> userHoldDTOS = allUserHold();
-        if (CollUtil.isNotEmpty(userHoldDTOS)) {
-            userHoldDTOS.sort(Comparator.comparing(UserHoldDTO::getPrice).reversed());
+        List<UserHoldDTO> userHoldDTOS = (List<UserHoldDTO>)redisTemplate.opsForValue().get(Constants.USER_HOLD_CACHE_KEY);
+        int totalElements;
+        if (CollectionUtils.isEmpty(userHoldDTOS)) {
+            totalElements = 0;
+            return new PageWrapper<>(new ArrayList<>(), page,
+                    size, totalElements);
         }
-        List<UserHoldDTO> newUserHoldList = userHoldDTOS.subList(start, start + size);
-        return new PageWrapper<>(newUserHoldList, page,
-                size, totalElements);
-    }
-
-    @Cacheable(value = "userHoldList")
-    public List<UserHoldDTO> allUserHold() {
-        Map<String, BigDecimal> minPriceMap = new HashMap<>();
-        List<Map<String, String>> assets = assetRepo.findAllUserHold();
-        JSONArray jsonArray = new JSONArray();
-        jsonArray.addAll(assets);
-        List<UserHoldDTO> userHoldDTOS = jsonArray.toJavaList(UserHoldDTO.class);
-        userHoldDTOS.forEach(userHoldDTO -> {
-            List<Asset> userAssets = assetRepo.findAllByUserIdAndStatusIn(userHoldDTO.getUserId(), new ArrayList<>(Arrays.asList(AssetStatus.NORMAL, AssetStatus.TRADING, AssetStatus.GIFTING, AssetStatus.MINTING, AssetStatus.AUCTIONING)));
-            // 分类计算各资产寄售最低价
-            userAssets.forEach(asset -> {
-                if (StringUtils.isBlank(asset.getPrefixName())) {
-                    return;
-                }
-                if (asset.getName().contains(Constants.Rarity.SR_LIKE) && !asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
-                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SR_LIKE, Constants.Rarity.SSR_LIKE);
-                    return;
-                }
-                if (asset.getName().contains(Constants.Rarity.U_LIKE)) {
-                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.U_LIKE, Constants.Rarity.R_LIKE);
-                    return;
-                }
-                if (asset.getName().contains(Constants.Rarity.R_LIKE) && !asset.getName().contains(Constants.Rarity.SR_LIKE)) {
-                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.R_LIKE, Constants.Rarity.SR_LIKE);
-                    return;
-                }
-                if (asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
-                    calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SSR_LIKE, Constants.Rarity.U_LIKE);
-                    return;
-                }
-                calculatePrice(userHoldDTO, asset, minPriceMap, null, null);
-            });
-        });
-        return userHoldDTOS;
-    }
-    private void calculatePrice(UserHoldDTO userHoldDTO, Asset asset, Map<String, BigDecimal> minPriceMap, String nameLike, String nameNotLike) {
-        BigDecimal minPrice;
-        String minPriceMapKey = StringUtils.isBlank(nameLike) ? asset.getPrefixName() : asset.getPrefixName().concat(nameLike);
-        if (minPriceMap.containsKey(minPriceMapKey)) {
-            minPrice = minPriceMap.get(minPriceMapKey);
+        totalElements = userHoldDTOS.size();
+        List<UserHoldDTO> newUserHoldList;
+        if (userHoldDTOS.size() < start + size) {
+            newUserHoldList = userHoldDTOS.subList(start, userHoldDTOS.size());
         } else {
-            // 该系列寄售最低价
-            if (StringUtils.isBlank(nameLike)) {
-                minPrice = collectionRepo.findMinPriceByPrefixName(asset.getPrefixName());
-            } else {
-                minPrice = collectionRepo.findMinPriceByNameAndPrefixName(asset.getPrefixName(), nameLike, nameNotLike);
-            }
-            // 该系列没有寄售的话取originalPrice
-            if(Objects.isNull(minPrice)) {
-                Collection collection = collectionRepo.findById(asset.getCollectionId()).orElse(null);
-                if (Objects.isNull(collection)) {
-                    minPrice = BigDecimal.ZERO;
-                } else {
-                    minPrice = collection.getOriginalPrice();
-                }
-            }
-//            minPrice = Objects.isNull(minPrice) ? BigDecimal.ZERO : minPrice;
-            minPriceMap.put(minPriceMapKey, minPrice);
+            newUserHoldList = userHoldDTOS.subList(start, start + size);
         }
-        userHoldDTO.setPrice(userHoldDTO.getPrice().add(minPrice));
+        return new PageWrapper<>(newUserHoldList, page,
+                size, totalElements);
     }
 
 }

+ 14 - 0
src/main/java/com/izouma/nineth/web/UserHoldCountController.java

@@ -3,6 +3,8 @@ package com.izouma.nineth.web;
 import com.alibaba.excel.util.CollectionUtils;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.UserHoldDTO;
+import com.izouma.nineth.service.CacheService;
+import com.izouma.nineth.service.UserHoldCountCache;
 import com.izouma.nineth.service.UserHoldCountService;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
@@ -21,6 +23,10 @@ public class UserHoldCountController {
 
     private UserHoldCountService userHoldCountService;
 
+    private CacheService cacheService;
+
+    private UserHoldCountCache userHoldCountCache;
+
     @PostMapping("/all")
     public Page<UserHoldDTO> all(@RequestBody PageQuery pageQuery) {
         return userHoldCountService.all(pageQuery).toPage();
@@ -59,4 +65,12 @@ public class UserHoldCountController {
         List<UserHoldDTO> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @GetMapping("/refresh")
+    public void refresh(){
+        // 清除缓存
+        cacheService.clearUserHold();
+        // 重新缓存
+        userHoldCountCache.allUserHold();
+    }
 }

+ 20 - 0
src/main/java/com/izouma/nineth/web/UserHoldCountScheduleTask.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.web;
+
+
+import lombok.AllArgsConstructor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+@Configuration
+@EnableScheduling
+@AllArgsConstructor
+public class UserHoldCountScheduleTask {
+
+    private UserHoldCountController userHoldCountController;
+
+    @Scheduled(cron = "0 0 22 ? * SUN")
+    private void configureTasks() {
+        userHoldCountController.refresh();
+    }
+}

+ 6 - 0
src/main/vue/src/views/UserHoldCountList.vue

@@ -10,6 +10,9 @@
             >
                 导出
             </el-button>
+            <el-button @click="refresh" type="primary" icon="el-icon-refresh" :loading="downloading" class="filter-item">
+                新增
+            </el-button>
         </page-title>
         <el-table
             :data="tableData"
@@ -90,6 +93,9 @@ export default {
                     this.downloading = false;
                     this.$message.error(e.error);
                 });
+        },
+        refresh() {
+            this.$axios.get('/userHold/refresh')
         }
     }
 };