UserHoldCountService.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package com.izouma.nineth.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.izouma.nineth.config.Constants;
  5. import com.izouma.nineth.domain.Asset;
  6. import com.izouma.nineth.domain.Collection;
  7. import com.izouma.nineth.dto.PageQuery;
  8. import com.izouma.nineth.dto.PageWrapper;
  9. import com.izouma.nineth.dto.UserHoldDTO;
  10. import com.izouma.nineth.enums.AssetStatus;
  11. import com.izouma.nineth.repo.AssetRepo;
  12. import com.izouma.nineth.repo.CollectionRepo;
  13. import lombok.AllArgsConstructor;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.springframework.cache.annotation.Cacheable;
  16. import org.springframework.stereotype.Service;
  17. import java.math.BigDecimal;
  18. import java.util.*;
  19. @Service
  20. @AllArgsConstructor
  21. public class UserHoldCountService {
  22. private AssetRepo assetRepo;
  23. private CollectionRepo collectionRepo;
  24. // @Cacheable(value = "userHoldList", key = "#pageQuery.hashCode()")
  25. public PageWrapper<UserHoldDTO> all(PageQuery pageQuery) {
  26. int page = pageQuery.getPage();
  27. int size = pageQuery.getSize();
  28. int start = page * size;
  29. int totalElements = assetRepo.totalElements();
  30. List<UserHoldDTO> userHoldDTOS = allUserHold();
  31. if (CollUtil.isNotEmpty(userHoldDTOS)) {
  32. userHoldDTOS.sort(Comparator.comparing(UserHoldDTO::getPrice).reversed());
  33. }
  34. List<UserHoldDTO> newUserHoldList = userHoldDTOS.subList(start, start + size);
  35. return new PageWrapper<>(newUserHoldList, page,
  36. size, totalElements);
  37. }
  38. @Cacheable(value = "userHoldList")
  39. public List<UserHoldDTO> allUserHold() {
  40. Map<String, BigDecimal> minPriceMap = new HashMap<>();
  41. List<Map<String, String>> assets = assetRepo.findAllUserHold();
  42. JSONArray jsonArray = new JSONArray();
  43. jsonArray.addAll(assets);
  44. List<UserHoldDTO> userHoldDTOS = jsonArray.toJavaList(UserHoldDTO.class);
  45. userHoldDTOS.forEach(userHoldDTO -> {
  46. List<Asset> userAssets = assetRepo.findAllByUserIdAndStatusIn(userHoldDTO.getUserId(), new ArrayList<>(Arrays.asList(AssetStatus.NORMAL, AssetStatus.TRADING, AssetStatus.GIFTING, AssetStatus.MINTING, AssetStatus.AUCTIONING)));
  47. // 分类计算各资产寄售最低价
  48. userAssets.forEach(asset -> {
  49. if (StringUtils.isBlank(asset.getPrefixName())) {
  50. return;
  51. }
  52. if (asset.getName().contains(Constants.Rarity.SR_LIKE) && !asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
  53. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SR_LIKE, Constants.Rarity.SSR_LIKE);
  54. return;
  55. }
  56. if (asset.getName().contains(Constants.Rarity.U_LIKE)) {
  57. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.U_LIKE, Constants.Rarity.R_LIKE);
  58. return;
  59. }
  60. if (asset.getName().contains(Constants.Rarity.R_LIKE) && !asset.getName().contains(Constants.Rarity.SR_LIKE)) {
  61. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.R_LIKE, Constants.Rarity.SR_LIKE);
  62. return;
  63. }
  64. if (asset.getName().contains(Constants.Rarity.SSR_LIKE)) {
  65. calculatePrice(userHoldDTO, asset, minPriceMap, Constants.Rarity.SSR_LIKE, Constants.Rarity.U_LIKE);
  66. return;
  67. }
  68. calculatePrice(userHoldDTO, asset, minPriceMap, null, null);
  69. });
  70. });
  71. return userHoldDTOS;
  72. }
  73. private void calculatePrice(UserHoldDTO userHoldDTO, Asset asset, Map<String, BigDecimal> minPriceMap, String nameLike, String nameNotLike) {
  74. BigDecimal minPrice;
  75. String minPriceMapKey = StringUtils.isBlank(nameLike) ? asset.getPrefixName() : asset.getPrefixName().concat(nameLike);
  76. if (minPriceMap.containsKey(minPriceMapKey)) {
  77. minPrice = minPriceMap.get(minPriceMapKey);
  78. } else {
  79. // 该系列寄售最低价
  80. if (StringUtils.isBlank(nameLike)) {
  81. minPrice = collectionRepo.findMinPriceByPrefixName(asset.getPrefixName());
  82. } else {
  83. minPrice = collectionRepo.findMinPriceByNameAndPrefixName(asset.getPrefixName(), nameLike, nameNotLike);
  84. }
  85. // 该系列没有寄售的话取originalPrice
  86. if(Objects.isNull(minPrice)) {
  87. Collection collection = collectionRepo.findById(asset.getCollectionId()).orElse(null);
  88. if (Objects.isNull(collection)) {
  89. minPrice = BigDecimal.ZERO;
  90. } else {
  91. minPrice = collection.getOriginalPrice();
  92. }
  93. }
  94. // minPrice = Objects.isNull(minPrice) ? BigDecimal.ZERO : minPrice;
  95. minPriceMap.put(minPriceMapKey, minPrice);
  96. }
  97. userHoldDTO.setPrice(userHoldDTO.getPrice().add(minPrice));
  98. }
  99. }