From 0776de7abe30cf75ba1a2bf7cc7a4dea7dca5502 Mon Sep 17 00:00:00 2001 From: bo Date: Thu, 28 Mar 2024 08:28:48 +0900 Subject: [PATCH] =?UTF-8?q?Update:=20=EC=83=81=EC=9E=A5=ED=8F=90=EC=A7=80?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bumawiki/domain/coin/domain/Trade.java | 7 ++-- .../repository/CoinAccountRepository.java | 3 ++ .../domain/coin/domain/type/TradeStatus.java | 1 + .../domain/coin/service/CoinService.java | 2 -- .../domain/coin/service/PriceScheduler.java | 32 ++++++++++++++++--- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/project/bumawiki/domain/coin/domain/Trade.java b/src/main/java/com/project/bumawiki/domain/coin/domain/Trade.java index 033844fc..a6b14f4b 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/domain/Trade.java +++ b/src/main/java/com/project/bumawiki/domain/coin/domain/Trade.java @@ -2,6 +2,8 @@ import java.time.LocalDateTime; +import org.springframework.data.annotation.CreatedDate; + import com.project.bumawiki.domain.coin.domain.type.TradeStatus; import jakarta.persistence.Entity; @@ -35,13 +37,10 @@ public Trade(Long coinPrice, Long coinCount, Long usedMoney, TradeStatus tradeSt this.usedMoney = usedMoney; this.tradeStatus = tradeStatus; this.coinAccountId = coinAccountId; + this.tradedTime = LocalDateTime.now(); } public void updateTradeStatus(TradeStatus tradeStatus) { this.tradeStatus = tradeStatus; } - - public void updateTradedTimeNow() { - this.tradedTime = LocalDateTime.now(); - } } diff --git a/src/main/java/com/project/bumawiki/domain/coin/domain/repository/CoinAccountRepository.java b/src/main/java/com/project/bumawiki/domain/coin/domain/repository/CoinAccountRepository.java index 9e9d1325..b8355ad8 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/domain/repository/CoinAccountRepository.java +++ b/src/main/java/com/project/bumawiki/domain/coin/domain/repository/CoinAccountRepository.java @@ -25,6 +25,9 @@ default CoinAccount getById(Long id) { .orElseThrow(CoinAccountNotFoundException::new); } + @Query(value = "select c from CoinAccount c where c.coin > 0") + List findAllByCoinGreaterThan0(); + @Query(value = "select c from CoinAccount c order by c.money + c.coin * :price desc, c.gotMoney asc") List getRanking(Pageable pageable, Long price); } diff --git a/src/main/java/com/project/bumawiki/domain/coin/domain/type/TradeStatus.java b/src/main/java/com/project/bumawiki/domain/coin/domain/type/TradeStatus.java index ca17f287..934f62ad 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/domain/type/TradeStatus.java +++ b/src/main/java/com/project/bumawiki/domain/coin/domain/type/TradeStatus.java @@ -6,5 +6,6 @@ public enum TradeStatus { SELLING, SOLD, CANCELLED, + DELISTING, NONE } diff --git a/src/main/java/com/project/bumawiki/domain/coin/service/CoinService.java b/src/main/java/com/project/bumawiki/domain/coin/service/CoinService.java index 9a804ecb..8c689bcd 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/service/CoinService.java +++ b/src/main/java/com/project/bumawiki/domain/coin/service/CoinService.java @@ -96,7 +96,6 @@ private void sellLater(Trade trade) { private void sellNow(Trade trade, CoinAccount coinAccount) { coinAccount.sellCoin(trade.getCoinPrice(), trade.getCoinCount()); trade.updateTradeStatus(TradeStatus.SOLD); - trade.updateTradedTimeNow(); } private void buyLater(Trade trade) { @@ -106,7 +105,6 @@ private void buyLater(Trade trade) { private void buyNow(Trade trade, CoinAccount coinAccount) { coinAccount.buyCoin(trade.getCoinPrice(), trade.getCoinCount()); trade.updateTradeStatus(TradeStatus.BOUGHT); - trade.updateTradedTimeNow(); } @Transactional(readOnly = true) diff --git a/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java b/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java index ba23ae0e..18a24b95 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java +++ b/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java @@ -31,18 +31,42 @@ void changePrice() { Price recentPrice = priceRepository.getRecentPrice(); Long max = recentPrice.getPrice() + CHANGE_MONEY_RANGE; - Long min = Math.max(recentPrice.getPrice() - CHANGE_MONEY_RANGE, 20000L); + Long min = Math.max(recentPrice.getPrice() - CHANGE_MONEY_RANGE, 0L); SecureRandom random = getRandomInstance(); - Long randomPrice = random.nextLong(max - min + 1L) + min; - Price newPrice = new Price(randomPrice - randomPrice % 100); + // Long randomPrice = random.nextLong(max - min + 1L) + min; + Long randomPrice = 0L; + Price newPrice; + if (randomPrice == 0) { + restartCoin(); + newPrice = new Price(100000L); + } else { + newPrice = new Price(randomPrice - randomPrice % 100); + } priceRepository.save(newPrice); - processBuyingTrade(newPrice); processSellingTrade(newPrice); } + private void restartCoin() { + List coinAccounts = coinAccountRepository.findAllByCoinGreaterThan0(); + + for (CoinAccount coinAccount : coinAccounts) { + Trade trade = new Trade( + 0L, + coinAccount.getCoin(), + 0L, + TradeStatus.DELISTING, + coinAccount.getId() + ); + coinAccount.sellCoin(0L, coinAccount.getCoin()); + + tradeRepository.save(trade); + coinAccountRepository.save(coinAccount); + } + } + private void processSellingTrade(Price newPrice) { List sellingTrades = tradeRepository.findAllByTradeStatus(TradeStatus.SELLING);