diff --git a/src/main/java/com/skyhorsemanpower/auction/domain/RoundInfo.java b/src/main/java/com/skyhorsemanpower/auction/domain/RoundInfo.java index 03ae0ad..e1e3ff3 100644 --- a/src/main/java/com/skyhorsemanpower/auction/domain/RoundInfo.java +++ b/src/main/java/com/skyhorsemanpower/auction/domain/RoundInfo.java @@ -30,11 +30,14 @@ public class RoundInfo { private Long numberOfParticipants; private Long leftNumberOfParticipants; private LocalDateTime createdAt; + private LocalDateTime auctionEndTime; + private Boolean isLastRound; @Builder public RoundInfo(String auctionUuid, Integer round, LocalDateTime roundStartTime, LocalDateTime roundEndTime, BigDecimal incrementUnit, BigDecimal price, Boolean isActive, Long numberOfParticipants, - Long leftNumberOfParticipants, LocalDateTime createdAt) { + Long leftNumberOfParticipants, LocalDateTime createdAt, + LocalDateTime auctionEndTime, Boolean isLastRound) { this.auctionUuid = auctionUuid; this.round = round; this.roundStartTime = roundStartTime; @@ -45,6 +48,8 @@ public RoundInfo(String auctionUuid, Integer round, LocalDateTime roundStartTime this.numberOfParticipants = numberOfParticipants; this.leftNumberOfParticipants = leftNumberOfParticipants; this.createdAt = LocalDateTime.now(); + this.auctionEndTime = auctionEndTime; + this.isLastRound = isLastRound; } public static RoundInfo nextRoundUpdate(RoundInfo roundInfo) { @@ -52,6 +57,10 @@ public static RoundInfo nextRoundUpdate(RoundInfo roundInfo) { LocalDateTime nextRoundStartTime = LocalDateTime.now().plusSeconds(StandbyTimeEnum.SECONDS_15.getSecond()); LocalDateTime nextRoundEndTime = nextRoundStartTime.plusSeconds(RoundTimeEnum.SECONDS_60.getSecond()); BigDecimal nextPrice = roundInfo.getPrice().add(roundInfo.getIncrementUnit()); + LocalDateTime auctionEndTime = roundInfo.getAuctionEndTime(); + + // nextRoundStartTime <= auctionEndTime <= nextRoundEndTime 인 경우 다음 라운드가 마지막 라운드 + boolean isLastRound = nextRoundStartTime.isBefore(auctionEndTime) && auctionEndTime.isBefore(nextRoundEndTime); return RoundInfo.builder() .auctionUuid(roundInfo.getAuctionUuid()) @@ -63,6 +72,8 @@ public static RoundInfo nextRoundUpdate(RoundInfo roundInfo) { .isActive(false) // 대기 상태로 변경 .numberOfParticipants(roundInfo.getNumberOfParticipants()) .leftNumberOfParticipants(roundInfo.getNumberOfParticipants()) + .auctionEndTime(roundInfo.getAuctionEndTime()) + .isLastRound(isLastRound) .build(); } @@ -79,6 +90,8 @@ public static RoundInfo currentRoundUpdate(RoundInfo roundInfo) { .isActive(true) .numberOfParticipants(roundInfo.getNumberOfParticipants()) .leftNumberOfParticipants(nextNumberOfParticipants) + .auctionEndTime(roundInfo.getAuctionEndTime()) + .isLastRound(roundInfo.getIsLastRound()) .build(); } @@ -93,6 +106,8 @@ public static RoundInfo setIsActiveTrue(RoundInfo roundInfo) { .isActive(true) .numberOfParticipants(roundInfo.getNumberOfParticipants()) .leftNumberOfParticipants(roundInfo.getLeftNumberOfParticipants()) + .auctionEndTime(roundInfo.getAuctionEndTime()) + .isLastRound(roundInfo.getIsLastRound()) .createdAt(LocalDateTime.now()) .build(); } diff --git a/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaConsumerCluster.java b/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaConsumerCluster.java index 2f5ce13..5db03f3 100644 --- a/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaConsumerCluster.java +++ b/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaConsumerCluster.java @@ -5,6 +5,7 @@ import com.skyhorsemanpower.auction.domain.RoundInfo; import com.skyhorsemanpower.auction.kafka.data.dto.InitialAuctionDto; import com.skyhorsemanpower.auction.repository.RoundInfoRepository; +import com.skyhorsemanpower.auction.status.AuctionTimeEnum; import com.skyhorsemanpower.auction.status.RoundTimeEnum; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -56,6 +57,7 @@ private void initialRoundInfo(InitialAuctionDto initialAuctionDto) { // Instant 타입을 LocalDateTime 변환 LocalDateTime roundStartTime = DateTimeConverter. instantToLocalDateTime(initialAuctionDto.getAuctionStartTime()); + LocalDateTime auctionEndTime = roundStartTime.plusMinutes(AuctionTimeEnum.MINUTES_120.getMinute()); RoundInfo roundinfo = RoundInfo.builder() .auctionUuid(initialAuctionDto.getAuctionUuid()) @@ -68,6 +70,8 @@ private void initialRoundInfo(InitialAuctionDto initialAuctionDto) { .numberOfParticipants((long) initialAuctionDto.getNumberOfEventParticipants()) .leftNumberOfParticipants((long) initialAuctionDto.getNumberOfEventParticipants()) .createdAt(LocalDateTime.now()) + .auctionEndTime(auctionEndTime) + .isLastRound(false) .build(); log.info("Initial round_info >>> {}", roundinfo); diff --git a/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaProducerConfig.java b/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaProducerConfig.java index 6429d55..8ac2368 100644 --- a/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaProducerConfig.java +++ b/src/main/java/com/skyhorsemanpower/auction/kafka/KafkaProducerConfig.java @@ -38,8 +38,8 @@ public KafkaTemplate kafkaTemplate() { @Bean public NewTopic auctionCloseTopic() { return TopicBuilder.name(Topics.Constant.AUCTION_CLOSE) - .partitions(1) - .replicas(1) + .partitions(2) + .replicas(2) .config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(172800000)) .build(); } @@ -47,8 +47,8 @@ public NewTopic auctionCloseTopic() { @Bean public NewTopic alarmTopic() { return TopicBuilder.name(Topics.Constant.ALARM) - .partitions(1) - .replicas(1) + .partitions(2) + .replicas(2) .config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(172800000)) .build(); }