Quellcode durchsuchen

Merge branch 'stock' into dev

# Conflicts:
#	src/main/java/com/izouma/nineth/repo/OrderRepo.java
#	src/main/java/com/izouma/nineth/service/AuctionActivityService.java
#	src/main/java/com/izouma/nineth/service/UserService.java
#	src/main/java/com/izouma/nineth/web/AssetController.java
licailing vor 3 Jahren
Ursprung
Commit
4562fc41ff

+ 35 - 0
src/main/java/com/izouma/nineth/domain/RockRecord.java

@@ -0,0 +1,35 @@
+package com.izouma.nineth.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+public class RockRecord extends BaseEntity {
+    private Long userId;
+
+    private String operation;
+
+    private BigDecimal amount;
+
+    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;
+    }
+}

+ 1 - 1
src/main/java/com/izouma/nineth/listener/OrderNotifyListener.java

@@ -17,7 +17,7 @@ import org.springframework.stereotype.Service;
         consumerGroup = "${general.order-notify-group}",
         topic = "${general.order-notify-topic}",
         consumeMode = ConsumeMode.CONCURRENTLY, consumeThreadMax = 2)
-@ConditionalOnProperty(value = "general.notify-server", havingValue = "true")
+@ConditionalOnProperty(value = "general.notify-server", havingValue = "true", matchIfMissing = true)
 public class OrderNotifyListener implements RocketMQListener<OrderNotifyEvent> {
     private OrderService        orderService;
     private MintOrderService    mintOrderService;

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

@@ -0,0 +1,26 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.RockRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+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;
 
     private AssetSuperimpositionService assetSuperimpositionService;
 
@@ -91,7 +93,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)));
@@ -100,7 +104,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)));
@@ -109,10 +115,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 AssetSuperimpositionService assetSuperimpositionService;
 
@@ -124,7 +121,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("绿洲石不足");

+ 54 - 0
src/main/java/com/izouma/nineth/service/RockRecordService.java

@@ -0,0 +1,54 @@
+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 TokenHistoryRepo tokenHistoryRepo;
+
+    public Page<RockRecord> all(PageQuery pageQuery) {
+        return rockRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, RockRecord.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    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 - 8
src/main/java/com/izouma/nineth/service/UserService.java

@@ -92,7 +92,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 +113,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 +749,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);

+ 60 - 0
src/main/java/com/izouma/nineth/web/RockRecordController.java

@@ -0,0 +1,60 @@
+package com.izouma.nineth.web;
+import com.izouma.nineth.domain.RockRecord;
+import com.izouma.nineth.service.RockRecordService;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.RockRecordRepo;
+import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/rockRecord")
+@AllArgsConstructor
+public class RockRecordController extends BaseController {
+    private RockRecordService rockRecordService;
+    private RockRecordRepo rockRecordRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public RockRecord save(@RequestBody RockRecord record) {
+        if (record.getId() != null) {
+            RockRecord orig = rockRecordRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return rockRecordRepo.save(orig);
+        }
+        return rockRecordRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<RockRecord> all(@RequestBody PageQuery pageQuery) {
+        return rockRecordService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public RockRecord get(@PathVariable Long id) {
+        return rockRecordRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        rockRecordRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<RockRecord> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 1 - 0
src/main/resources/genjson/RockRecord.json

@@ -0,0 +1 @@
+{"tableName":"RockRecord","className":"RockRecord","remark":"绿洲石记录","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/raex_back/src/main/java/com/izouma/nineth","viewPath":"/Users/qiufangchao/Desktop/project/raex_back/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/raex_back/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/raex_back/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"userId","showInList":true,"showInForm":true,"formType":"number"},{"name":"operation","modelName":"operation","remark":"operation","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"num","modelName":"num","remark":"num","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"lastNum","modelName":"lastNum","remark":"lastNum","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.nineth","tablePackage":"com.izouma.nineth.domain.RockRecord"}

+ 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());
+        });
+
+
+    }
 }