UserHoldCountCache.java 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.izouma.nineth.service;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.izouma.nineth.config.Constants;
  4. import com.izouma.nineth.domain.Asset;
  5. import com.izouma.nineth.domain.Collection;
  6. import com.izouma.nineth.dto.UserHoldDTO;
  7. import com.izouma.nineth.enums.AssetStatus;
  8. import com.izouma.nineth.repo.AssetRepo;
  9. import com.izouma.nineth.repo.CollectionRepo;
  10. import lombok.AllArgsConstructor;
  11. import org.apache.commons.collections.CollectionUtils;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.stereotype.Service;
  15. import java.math.BigDecimal;
  16. import java.util.*;
  17. @Service
  18. @AllArgsConstructor
  19. public class UserHoldCountCache {
  20. private CollectionRepo collectionRepo;
  21. private AssetRepo assetRepo;
  22. private RedisTemplate<String, Object> redisTemplate;
  23. public void allUserHold() {
  24. // 清理用户持仓缓存
  25. redisTemplate.delete(Constants.USER_HOLD_CACHE_KEY);
  26. Map<String, BigDecimal> minPriceMap = new HashMap<>();
  27. List<Map<String, String>> assets = assetRepo.findAllUserHold();
  28. JSONArray jsonArray = new JSONArray();
  29. jsonArray.addAll(assets);
  30. List<UserHoldDTO> userHoldDTOS = jsonArray.toJavaList(UserHoldDTO.class);
  31. userHoldDTOS.forEach(userHoldDTO -> {
  32. List<Asset> userAssets = assetRepo.findAllByUserIdAndStatusIn(userHoldDTO.getUserId(), new ArrayList<>(Arrays.asList(AssetStatus.NORMAL, AssetStatus.TRADING, AssetStatus.GIFTING, AssetStatus.MINTING, AssetStatus.AUCTIONING)));
  33. // 分类计算各资产寄售最低价
  34. userAssets.forEach(asset -> {
  35. if (StringUtils.isBlank(asset.getPrefixName())) {
  36. return;
  37. }
  38. if (asset.getName().contains(Constants.Rarity.SR_LIKE) && !asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
  39. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SR_LIKE, Constants.Rarity.SSR_LIKE);
  40. return;
  41. }
  42. if (asset.getName().contains(Constants.Rarity.U_LIKE)) {
  43. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.U_LIKE, Constants.Rarity.R_LIKE);
  44. return;
  45. }
  46. if (asset.getName().contains(Constants.Rarity.R_LIKE) && !asset.getName().contains(Constants.Rarity.SR_LIKE)) {
  47. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.R_LIKE, Constants.Rarity.SR_LIKE);
  48. return;
  49. }
  50. if (asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
  51. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SSR_LIKE, Constants.Rarity.U_LIKE);
  52. return;
  53. }
  54. calculatePrice(userHoldDTO, asset, minPriceMap, null, null);
  55. });
  56. });
  57. if (CollectionUtils.isNotEmpty(userHoldDTOS)) {
  58. userHoldDTOS.sort(Comparator.comparing(UserHoldDTO::getPrice).reversed());
  59. }
  60. // 重新缓存持仓信息
  61. redisTemplate.opsForValue().set(Constants.USER_HOLD_CACHE_KEY, userHoldDTOS);
  62. }
  63. private void calculatePrice(UserHoldDTO userHoldDTO, Asset asset, Map<String, BigDecimal> minPriceMap, String nameLike, String nameNotLike) {
  64. BigDecimal minPrice;
  65. String minPriceMapKey = StringUtils.isBlank(nameLike) ? asset.getPrefixName() : asset.getPrefixName().concat(nameLike);
  66. if (minPriceMap.containsKey(minPriceMapKey)) {
  67. minPrice = minPriceMap.get(minPriceMapKey);
  68. } else {
  69. // 该系列寄售最低价
  70. if (StringUtils.isBlank(nameLike)) {
  71. minPrice = collectionRepo.findMinPriceByPrefixName(asset.getPrefixName());
  72. } else {
  73. minPrice = collectionRepo.findMinPriceByNameAndPrefixName(asset.getPrefixName(), nameLike, nameNotLike);
  74. }
  75. // 该系列没有寄售的话取originalPrice
  76. if (Objects.isNull(minPrice)) {
  77. Collection collection = collectionRepo.findById(asset.getCollectionId()).orElse(null);
  78. if (Objects.isNull(collection)) {
  79. minPrice = BigDecimal.ZERO;
  80. } else {
  81. minPrice = collection.getOriginalPrice();
  82. }
  83. }
  84. // minPrice = Objects.isNull(minPrice) ? BigDecimal.ZERO : minPrice;
  85. minPriceMap.put(minPriceMapKey, minPrice);
  86. }
  87. userHoldDTO.setPrice(userHoldDTO.getPrice().add(minPrice));
  88. }
  89. }