Browse Source

绿洲石

licailing 3 năm trước cách đây
mục cha
commit
fca849f11e

+ 14 - 2
src/main/java/com/izouma/nineth/domain/RockRecord.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import java.math.BigDecimal;
 
 @Data
 @AllArgsConstructor
@@ -17,7 +18,18 @@ public class RockRecord extends BaseEntity {
 
     private String operation;
 
-    private int num;
+    private BigDecimal amount;
 
-    private int lastNum;
+    private BigDecimal record;
+
+    private BigDecimal lastRecord;
+
+    public RockRecord addRecord(Long userId, BigDecimal amount, String operation) {
+        this.userId = userId;
+        this.amount = amount;
+        this.operation = operation;
+        this.lastRecord = record;
+        this.record = this.record.add(amount);
+        return this;
+    }
 }

+ 10 - 0
src/main/java/com/izouma/nineth/repo/RockRecordRepo.java

@@ -7,10 +7,20 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.math.BigDecimal;
+import java.util.Collection;
 
 public interface RockRecordRepo extends JpaRepository<RockRecord, Long>, JpaSpecificationExecutor<RockRecord> {
     @Query("update RockRecord t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    RockRecord findFirstByUserIdOrderByIdDesc(Long userId);
+
+    @Query(nativeQuery = true, value = "select ifnull(record, 0) from rock_record where user_id = ?1 order by id desc limit 1")
+    BigDecimal findRecordByUserIdOrderByIdDesc(Long userId);
+
+    @Query(nativeQuery = true, value = "select ifnull(sum(record), 0) from rock_record where user_id in ?1 order by id desc limit 1")
+    BigDecimal findRecordByUserIdOrderByIdInDesc(Collection<Long> userId);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java

@@ -51,4 +51,6 @@ public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, Jpa
     List<Map<String, Object>> sumPrice(LocalDateTime start, LocalDateTime end, int size);
 
     Optional<TokenHistory> findByToUserIdAndTokenId(Long toUserId, String tokenId);
+
+    List<TokenHistory> findAllByPriceIsNotNull();
 }

+ 31 - 15
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -63,6 +63,8 @@ public class AssetService {
     private DestroyRecordRepo       destroyRecordRepo;
     private AirDropService          airDropService;
     private HCChainService          hcChainService;
+    private RockRecordService       rockRecordService;
+    private RockRecordRepo          rockRecordRepo;
 
     public Page<Asset> all(PageQuery pageQuery) {
         Page<Asset> all = assetRepo
@@ -89,7 +91,9 @@ public class AssetService {
             return assetDTOs;
         }
         // 取出资产中未开启盲盒数据
-        List<Asset> blindBoxClosedAssets = assets.stream().filter(asset -> !asset.isOpened() && CollectionType.BLIND_BOX.equals(asset.getType())).collect(Collectors.toList());
+        List<Asset> blindBoxClosedAssets = assets.stream()
+                .filter(asset -> !asset.isOpened() && CollectionType.BLIND_BOX.equals(asset.getType()))
+                .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(blindBoxClosedAssets)) {
             blindBoxClosedAssets.forEach(asset -> {
                 assetDTOs.add(AssetDTO.create(Lists.newArrayList(asset)));
@@ -98,7 +102,9 @@ public class AssetService {
             assets.removeAll(blindBoxClosedAssets);
         }
         // 取出资产中所有未设置prefixName的值
-        List<Asset> prefixNameIsNullAssets = assets.stream().filter(asset -> StringUtils.isBlank(asset.getPrefixName())).collect(Collectors.toList());
+        List<Asset> prefixNameIsNullAssets = assets.stream()
+                .filter(asset -> StringUtils.isBlank(asset.getPrefixName()))
+                .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(prefixNameIsNullAssets)) {
             prefixNameIsNullAssets.forEach(asset -> {
                 assetDTOs.add(AssetDTO.create(Lists.newArrayList(asset)));
@@ -107,10 +113,15 @@ public class AssetService {
         }
         if (CollectionUtils.isNotEmpty(assets)) {
             // 取出资产中所有prefixName
-            List<String> prefixNames = assets.stream().map(Asset::getPrefixName).distinct().collect(Collectors.toList());
+            List<String> prefixNames = assets.stream()
+                    .map(Asset::getPrefixName)
+                    .distinct()
+                    .collect(Collectors.toList());
             // 将资产中相同prefixName归类(除未开启盲盒和未设置prefixName)
             prefixNames.forEach(str -> {
-                List<Asset> collect = assets.stream().filter(asset -> str.equals(asset.getPrefixName())).collect(Collectors.toList());
+                List<Asset> collect = assets.stream()
+                        .filter(asset -> str.equals(asset.getPrefixName()))
+                        .collect(Collectors.toList());
                 assetDTOs.add(AssetDTO.create(collect));
             });
         }
@@ -507,6 +518,11 @@ public class AssetService {
                 .build();
         tokenHistoryRepo.save(tokenHistory);
 
+        //购买者加绿洲石
+        if (TransferReason.TRANSFER.equals(reason) || TransferReason.AUCTION.equals(reason)) {
+            rockRecordService.addRock(newOwner.getId(), price, "购买");
+        }
+
         asset.setPublicShow(false);
         asset.setConsignment(false);
         asset.setPublicCollectionId(null);
@@ -658,18 +674,18 @@ public class AssetService {
 
     @Cacheable(value = "userStat", key = "#userId")
     public Map<String, BigDecimal> breakdown(Long userId) {
-        List<TokenHistory> page = tokenHistoryRepo.userHistory(userId);
-        BigDecimal sale = page.stream()
-                .filter(th -> th.getFromUserId().equals(userId) && ObjectUtils.isNotEmpty(th.getPrice()))
-                .map(TokenHistory::getPrice)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal buy = page.stream()
-                .filter(th -> th.getToUserId().equals(userId) && ObjectUtils.isNotEmpty(th.getPrice()))
-                .map(TokenHistory::getPrice)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        List<TokenHistory> page = tokenHistoryRepo.userHistory(userId);
+//        BigDecimal sale = page.stream()
+//                .filter(th -> th.getFromUserId().equals(userId) && ObjectUtils.isNotEmpty(th.getPrice()))
+//                .map(TokenHistory::getPrice)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        BigDecimal buy = page.stream()
+//                .filter(th -> th.getToUserId().equals(userId) && ObjectUtils.isNotEmpty(th.getPrice()))
+//                .map(TokenHistory::getPrice)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
         Map<String, BigDecimal> map = new HashMap<>();
-        map.put("sale", sale);
-        map.put("buy", buy);
+        map.put("sale", BigDecimal.ZERO);
+        map.put("buy", rockRecordRepo.findRecordByUserIdOrderByIdDesc(userId));
         return map;
     }
 

+ 3 - 6
src/main/java/com/izouma/nineth/service/AuctionActivityService.java

@@ -9,10 +9,7 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.auction.AuctionInputDTO;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.AssetRepo;
-import com.izouma.nineth.repo.AuctionActivityRepo;
-import com.izouma.nineth.repo.TokenHistoryRepo;
-import com.izouma.nineth.repo.UserRepo;
+import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
@@ -49,8 +46,8 @@ public class AuctionActivityService {
     private final CacheService                  cacheService;
     private final TaskScheduler                 taskScheduler;
     private final Environment                   env;
-    private final TokenHistoryRepo              tokenHistoryRepo;
     private final SysConfigService              sysConfigService;
+    private final RockRecordRepo                rockRecordRepo;
 
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
 
@@ -122,7 +119,7 @@ public class AuctionActivityService {
             if (!AuthStatus.SUCCESS.equals(user.getAuthStatus())) {
                 throw new BusinessException("未实名或实名未通过");
             }
-            BigDecimal userBuy = tokenHistoryRepo.userBuy(record.getSellerId());
+            BigDecimal userBuy = rockRecordRepo.findRecordByUserIdOrderByIdDesc(user.getId());
             BigDecimal num = sysConfigService.getBigDecimal("auction_lvzhoushi_num");
             if (userBuy.compareTo(num) < 0) {
                 throw new BusinessException("绿洲石不足");

+ 32 - 2
src/main/java/com/izouma/nineth/service/RockRecordService.java

@@ -3,22 +3,52 @@ package com.izouma.nineth.service;
 import com.izouma.nineth.domain.RockRecord;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.repo.RockRecordRepo;
+import com.izouma.nineth.repo.TokenHistoryRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+
 @Service
 @AllArgsConstructor
 public class RockRecordService {
 
-    private RockRecordRepo rockRecordRepo;
+    private RockRecordRepo   rockRecordRepo;
+    private TokenHistoryRepo tokenHistoryRepo;
 
     public Page<RockRecord> all(PageQuery pageQuery) {
         return rockRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, RockRecord.class), JpaUtils.toPageRequest(pageQuery));
     }
 
-    public void addRock(){
+    public RockRecord getRock(Long userId) {
+        RockRecord rockRecord = rockRecordRepo.findFirstByUserIdOrderByIdDesc(userId);
+        if (rockRecord != null) {
+            return rockRecord;
+        }
+        BigDecimal amount = tokenHistoryRepo.userBuy(userId);
+        if (amount == null) {
+            return RockRecord.builder()
+                    .lastRecord(BigDecimal.ZERO)
+                    .amount(BigDecimal.ZERO)
+                    .userId(userId)
+                    .record(BigDecimal.ZERO)
+                    .build();
+        }
+        return rockRecordRepo.save(RockRecord.builder()
+                .lastRecord(BigDecimal.ZERO)
+                .operation("购买")
+                .amount(amount)
+                .userId(userId)
+                .record(amount)
+                .build());
+    }
 
+    @CacheEvict(value = "userStat",key = "#userId")
+    public RockRecord addRock(Long userId, BigDecimal amount, String operation) {
+        RockRecord rock = this.getRock(userId);
+        return rockRecordRepo.save(rock.addRecord(userId, amount, operation));
     }
 }

+ 9 - 9
src/main/java/com/izouma/nineth/service/UserService.java

@@ -16,7 +16,6 @@ import com.alipay.api.response.AlipayUserCertifyOpenCertifyResponse;
 import com.alipay.api.response.AlipayUserCertifyOpenInitializeResponse;
 import com.alipay.api.response.AlipayUserCertifyOpenQueryResponse;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
-import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.config.RedisKeys;
@@ -92,7 +91,6 @@ public class UserService {
     private UserBankCardRepo              userBankCardRepo;
     private InviteRepo                    inviteRepo;
     private CacheService                  cacheService;
-    private TokenHistoryRepo              tokenHistoryRepo;
     private CollectionRepo                collectionRepo;
     private AdapayMerchantService         adapayMerchantService;
     private RocketMQTemplate              rocketMQTemplate;
@@ -114,6 +112,7 @@ public class UserService {
     private ShowroomService               showroomService;
     private NewsLikeRepo                  newsLikeRepo;
     private UserPropertyRepo              userPropertyRepo;
+    private RockRecordRepo                rockRecordRepo;
 
     public User update(User user) {
         if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
@@ -749,19 +748,20 @@ public class UserService {
         Page<User> all = this.all(pageQuery).toPage();
 
         List<Long> userIds = all.map(User::getId).getContent();
-        List<TokenHistory> page = tokenHistoryRepo.userBuy(userIds);
-        Map<Long, BigDecimal> buy = page.stream()
-                .collect(Collectors.groupingBy(TokenHistory::getToUserId,
-                        Collectors.mapping(TokenHistory::getPrice,
-                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+//        List<TokenHistory> page = tokenHistoryRepo.userBuy(userIds);
+//        Map<Long, BigDecimal> buy = page.stream()
+//                .collect(Collectors.groupingBy(TokenHistory::getToUserId,
+//                        Collectors.mapping(TokenHistory::getPrice,
+//                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
 
         Page<InvitePhoneDTO> users = all.map(user -> {
             InvitePhoneDTO dto = new InvitePhoneDTO(user);
-            dto.setTotal(buy.get(user.getId()) == null ? BigDecimal.ZERO : buy.get(user.getId()));
+            BigDecimal buy = rockRecordRepo.findRecordByUserIdOrderByIdDesc(user.getId());
+            dto.setTotal(buy);
             return dto;
         });
 
-        BigDecimal total = buy.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal total = rockRecordRepo.findRecordByUserIdOrderByIdInDesc(userIds);
 
         Map<String, Object> map = new HashMap<>();
         map.put("user", users);

+ 40 - 2
src/test/java/com/izouma/nineth/repo/UserRepoTest.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.repo;
 
 import com.github.javafaker.Faker;
+import com.izouma.nineth.TokenHistory;
+import com.izouma.nineth.domain.RockRecord;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.enums.AuthorityName;
 import com.izouma.nineth.security.Authority;
@@ -12,16 +14,22 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
 public class UserRepoTest {
     @Autowired
-    private UserRepo        userRepo;
+    private UserRepo         userRepo;
     @Autowired
-    private PasswordEncoder passwordEncoder;
+    private PasswordEncoder  passwordEncoder;
+    @Autowired
+    private TokenHistoryRepo tokenHistoryRepo;
+    @Autowired
+    private RockRecordRepo   rockRecordRepo;
 
 
     @Test
@@ -76,4 +84,34 @@ public class UserRepoTest {
         User user = userRepo.findById(9972L).orElse(null);
         System.out.println(passwordEncoder.matches("123456", user.getTradeCode()));
     }
+
+    @Test
+    public void test2() {
+        //初始化
+        List<TokenHistory> histories = tokenHistoryRepo.findAllByPriceIsNotNull();
+        Map<Long, BigDecimal> rockMap = histories.stream()
+                .collect(Collectors.groupingBy(TokenHistory::getToUserId, Collectors.reducing(BigDecimal.ZERO,
+                        TokenHistory::getPrice,
+                        BigDecimal::add)));
+
+        Map<Long, User> userMap = userRepo.findAllById(rockMap.keySet())
+                .stream()
+                .collect(Collectors.toMap(User::getId, user -> user));
+
+        rockMap.forEach((key, value) -> {
+            User user = userMap.get(key);
+            if (user != null) {
+                user.setRock(value);
+                userRepo.save(user);
+            }
+            rockRecordRepo.save(RockRecord.builder()
+                    .lastNum(BigDecimal.ZERO)
+                    .num(value)
+                    .operation("购买")
+                    .userId(key)
+                    .build());
+        });
+
+
+    }
 }