From ff48207a3c4b86fdc0b8cd9f8d0a72cdf8c0ae8c Mon Sep 17 00:00:00 2001 From: midday2612 Date: Tue, 10 Jun 2025 10:48:12 +0900 Subject: [PATCH 1/4] =?UTF-8?q?KW-637/refactor:=20enter=20log=EC=97=90=20v?= =?UTF-8?q?isit=20category=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20join=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/consumer/AreaEnterLogConsumer.java | 6 +- .../domain/log/domain/EnterLog.java | 12 +++- .../BuildingEnterLogRepository.java | 59 ++++++++++--------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java b/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java index 1238d7b..48e1a4a 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java +++ b/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; + +import com.doubleo.logservice.global.enums.VisitCategory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.stream.Consumer; @@ -58,7 +60,9 @@ public void consumeMessages() { Long.parseLong((String) data.get("areaId")), Long.parseLong((String) data.get("memberId")), (String) data.get("memberName"), - Long.parseLong((String) data.get("passId"))); + Long.parseLong((String) data.get("passId")), + VisitCategory.valueOf((String) data.get("visitCategory")) + ); enterLogRepository.save(enterLog); redisTemplate.opsForStream().acknowledge(GROUP, msg); diff --git a/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java b/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java index 97f0d42..a58ea74 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java +++ b/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java @@ -1,6 +1,7 @@ package com.doubleo.logservice.domain.log.domain; import com.doubleo.logservice.domain.common.model.BaseEntity; +import com.doubleo.logservice.global.enums.VisitCategory; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -30,23 +31,30 @@ public class EnterLog extends BaseEntity { @Column(name = "pass_id", nullable = false) private Long passId; + @Column(name = "visit_category") + @Enumerated(EnumType.STRING) + private VisitCategory visitCategory; + @Builder(access = AccessLevel.PRIVATE) - private EnterLog(String tenantId, Long areaId, Long memberId, String memberName, Long passId) { + private EnterLog(String tenantId, Long areaId, Long memberId, String memberName, Long passId,VisitCategory visitCategory) { this.tenantId = tenantId; this.areaId = areaId; this.memberId = memberId; this.memberName = memberName; this.passId = passId; + this.visitCategory = visitCategory; + } public static EnterLog createEnterLog( - String tenantId, Long areaId, Long memberId, String memberName, Long passId) { + String tenantId, Long areaId, Long memberId, String memberName, Long passId, VisitCategory visitCategory) { return EnterLog.builder() .tenantId(tenantId) .areaId(areaId) .memberId(memberId) .memberName(memberName) .passId(passId) + .visitCategory(visitCategory) .build(); } } diff --git a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java index 6b0ca3c..a4420ed 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java +++ b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java @@ -24,17 +24,17 @@ SELECT COUNT(*) FROM BuildingEnterLog l @Query( """ - SELECT new com.doubleo.logservice.domain.stats.dto.request.UpdateDailyEntryStatsRequest( - b.buildingId, b.memberName, p.visitCategory, COUNT(b) + SELECT new com.doubleo.logservice.domain.stats.dto.request.UpdateDailyEntryStatsRequest( + b.buildingId, b.memberName, b.visitCategory, COUNT(b) + ) + FROM BuildingEnterLog b + WHERE b.direction = 'IN' + AND b.createdDt >= :start + AND b.createdDt < :end + AND b.tenantId = :tenantId + GROUP BY b.buildingId, b.memberName, b.visitCategory + """ ) - FROM BuildingEnterLog b - JOIN IssuedLog p ON b.passId = p.passId - WHERE b.direction = 'IN' - AND b.createdDt >= :start - AND b.createdDt < :end - AND b.tenantId = :tenantId - GROUP BY b.buildingId, b.memberName, p.visitCategory -""") List countDailyGrouped( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @@ -56,32 +56,33 @@ Long countEnteredBetween( @Query( """ - SELECT COUNT(b) - FROM BuildingEnterLog b - JOIN IssuedLog p ON b.passId = p.passId - WHERE b.direction = 'IN' - AND b.createdDt >= :start - AND b.createdDt < :end - AND b.tenantId = :tenantId - AND p.visitCategory = :visitCategory -""") + SELECT COUNT(b) + FROM BuildingEnterLog b + WHERE b.direction = 'IN' + AND b.createdDt >= :start + AND b.createdDt < :end + AND b.tenantId = :tenantId + AND b.visitCategory = :visitCategory + """ + ) int countEnteredByCategory( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("tenantId") String tenantId, - @Param("visitCategory") VisitCategory visitCategory); + @Param("visitCategory") VisitCategory visitCategory + ); @Query( """ - SELECT COUNT(b) - FROM BuildingEnterLog b - JOIN IssuedLog p ON b.passId = p.passId - WHERE b.direction = 'OUT' - AND b.createdDt >= :start - AND b.createdDt < :end - AND b.tenantId = :tenantId - AND p.visitCategory = :visitCategory -""") + SELECT COUNT(b) + FROM BuildingEnterLog b + WHERE b.direction = 'OUT' + AND b.createdDt >= :start + AND b.createdDt < :end + AND b.tenantId = :tenantId + AND b.visitCategory = :visitCategory + """ + ) int countExitedByCategory( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, From 61959708159c75e633ce01303cfe2180134a59e1 Mon Sep 17 00:00:00 2001 From: midday2612 Date: Tue, 10 Jun 2025 10:52:41 +0900 Subject: [PATCH 2/4] =?UTF-8?q?KW-637/fix:=20tenant=20id=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=20=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/BuildingEnterLogRepository.java | 17 ++++++++++++----- .../domain/stats/service/StatsServiceImpl.java | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java index a4420ed..23097e8 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java +++ b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java @@ -14,11 +14,18 @@ public interface BuildingEnterLogRepository extends JpaRepository { @Query( """ - SELECT COUNT(*) FROM BuildingEnterLog l - WHERE l.direction = 'IN' - AND l.createdDt >= :start AND l.createdDt < :end -""") - int countInLogsAtHour(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end); + SELECT COUNT(l) FROM BuildingEnterLog l + WHERE l.direction = 'IN' + AND l.createdDt >= :start + AND l.createdDt < :end + AND l.tenantId = :tenantId + """ + ) + int countInLogsAtHour( + @Param("start") LocalDateTime start, + @Param("end") LocalDateTime end, + @Param("tenantId") String tenantId + ); Page findAllByTenantId(String tenantId, Pageable pageable); diff --git a/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java b/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java index 5d0ab24..252a1b1 100644 --- a/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java +++ b/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java @@ -61,7 +61,7 @@ public List getHourlyEntryList() { if (cachedCount != null) { total = Integer.parseInt(cachedCount); } else { - int count = buildingEnterLogRepository.countInLogsAtHour(hour, hour.plusHours(1)); + int count = buildingEnterLogRepository.countInLogsAtHour(hour, hour.plusHours(1), tenantId); redisTemplate .opsForValue() .set(redisKey, String.valueOf(count), Duration.ofSeconds(10)); From c539fe66268deedcf3e0ba0bb4d1e252b96f117a Mon Sep 17 00:00:00 2001 From: midday2612 Date: Tue, 10 Jun 2025 10:55:27 +0900 Subject: [PATCH 3/4] =?UTF-8?q?KW-637/fix:=20countPassesByDateAndArea=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20where=20=EC=A1=B0=EA=B1=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/stats/repository/IssuedLogQueryRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/doubleo/logservice/domain/stats/repository/IssuedLogQueryRepository.java b/src/main/java/com/doubleo/logservice/domain/stats/repository/IssuedLogQueryRepository.java index 6cfd64e..e515540 100644 --- a/src/main/java/com/doubleo/logservice/domain/stats/repository/IssuedLogQueryRepository.java +++ b/src/main/java/com/doubleo/logservice/domain/stats/repository/IssuedLogQueryRepository.java @@ -32,8 +32,8 @@ SELECT COUNT(il) WHERE ila.tenantId = :tenantId AND ila.areaCode = :areaCode AND il.visitCategory IN :categories - AND il.startAt <= :endOfDay - AND il.expiredAt >= :startOfDay + AND il.createdDt <= :endOfDay + AND il.createdDt >= :startOfDay """; TypedQuery query = em.createQuery(jpql, Long.class); From 28cff5612f626fffab96f57a98ca942f918be83c Mon Sep 17 00:00:00 2001 From: midday2612 Date: Tue, 10 Jun 2025 11:54:06 +0900 Subject: [PATCH 4/4] =?UTF-8?q?KW-637/chore:=20spotless=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/consumer/AreaEnterLogConsumer.java | 6 ++---- .../logservice/domain/log/domain/EnterLog.java | 16 +++++++++++++--- .../repository/BuildingEnterLogRepository.java | 18 ++++++------------ .../domain/stats/service/StatsServiceImpl.java | 4 +++- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java b/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java index 48e1a4a..6fa6a6f 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java +++ b/src/main/java/com/doubleo/logservice/domain/log/consumer/AreaEnterLogConsumer.java @@ -2,11 +2,10 @@ import com.doubleo.logservice.domain.log.domain.EnterLog; import com.doubleo.logservice.domain.log.repository.EnterLogRepository; +import com.doubleo.logservice.global.enums.VisitCategory; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; - -import com.doubleo.logservice.global.enums.VisitCategory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.stream.Consumer; @@ -61,8 +60,7 @@ public void consumeMessages() { Long.parseLong((String) data.get("memberId")), (String) data.get("memberName"), Long.parseLong((String) data.get("passId")), - VisitCategory.valueOf((String) data.get("visitCategory")) - ); + VisitCategory.valueOf((String) data.get("visitCategory"))); enterLogRepository.save(enterLog); redisTemplate.opsForStream().acknowledge(GROUP, msg); diff --git a/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java b/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java index a58ea74..83a07be 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java +++ b/src/main/java/com/doubleo/logservice/domain/log/domain/EnterLog.java @@ -36,18 +36,28 @@ public class EnterLog extends BaseEntity { private VisitCategory visitCategory; @Builder(access = AccessLevel.PRIVATE) - private EnterLog(String tenantId, Long areaId, Long memberId, String memberName, Long passId,VisitCategory visitCategory) { + private EnterLog( + String tenantId, + Long areaId, + Long memberId, + String memberName, + Long passId, + VisitCategory visitCategory) { this.tenantId = tenantId; this.areaId = areaId; this.memberId = memberId; this.memberName = memberName; this.passId = passId; this.visitCategory = visitCategory; - } public static EnterLog createEnterLog( - String tenantId, Long areaId, Long memberId, String memberName, Long passId, VisitCategory visitCategory) { + String tenantId, + Long areaId, + Long memberId, + String memberName, + Long passId, + VisitCategory visitCategory) { return EnterLog.builder() .tenantId(tenantId) .areaId(areaId) diff --git a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java index 23097e8..ee4d9f7 100644 --- a/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java +++ b/src/main/java/com/doubleo/logservice/domain/log/repository/BuildingEnterLogRepository.java @@ -19,13 +19,11 @@ SELECT COUNT(l) FROM BuildingEnterLog l AND l.createdDt >= :start AND l.createdDt < :end AND l.tenantId = :tenantId - """ - ) + """) int countInLogsAtHour( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, - @Param("tenantId") String tenantId - ); + @Param("tenantId") String tenantId); Page findAllByTenantId(String tenantId, Pageable pageable); @@ -40,8 +38,7 @@ b.buildingId, b.memberName, b.visitCategory, COUNT(b) AND b.createdDt < :end AND b.tenantId = :tenantId GROUP BY b.buildingId, b.memberName, b.visitCategory - """ - ) + """) List countDailyGrouped( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @@ -70,14 +67,12 @@ SELECT COUNT(b) AND b.createdDt < :end AND b.tenantId = :tenantId AND b.visitCategory = :visitCategory - """ - ) + """) int countEnteredByCategory( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("tenantId") String tenantId, - @Param("visitCategory") VisitCategory visitCategory - ); + @Param("visitCategory") VisitCategory visitCategory); @Query( """ @@ -88,8 +83,7 @@ SELECT COUNT(b) AND b.createdDt < :end AND b.tenantId = :tenantId AND b.visitCategory = :visitCategory - """ - ) + """) int countExitedByCategory( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, diff --git a/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java b/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java index 252a1b1..391714a 100644 --- a/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java +++ b/src/main/java/com/doubleo/logservice/domain/stats/service/StatsServiceImpl.java @@ -61,7 +61,9 @@ public List getHourlyEntryList() { if (cachedCount != null) { total = Integer.parseInt(cachedCount); } else { - int count = buildingEnterLogRepository.countInLogsAtHour(hour, hour.plusHours(1), tenantId); + int count = + buildingEnterLogRepository.countInLogsAtHour( + hour, hour.plusHours(1), tenantId); redisTemplate .opsForValue() .set(redisKey, String.valueOf(count), Duration.ofSeconds(10));