Skip to content

Commit

Permalink
오픈가능성 판단 작성 (#62)
Browse files Browse the repository at this point in the history
  • Loading branch information
hOch1 authored Sep 25, 2024
1 parent dd16522 commit f4bc1ef
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 3 deletions.
23 changes: 23 additions & 0 deletions src/main/java/com/dongyang/dongpo/domain/store/OpenTime.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dongyang.dongpo.domain.store;

import lombok.Getter;

@Getter
public enum OpenTime {

MIDNIGHT_TO_3AM("00:00 - 03:00"),
THREE_AM_TO_6AM("03:00 - 06:00"),
SIX_AM_TO_9AM("06:00 - 09:00"),
NINE_AM_TO_NOON("09:00 - 12:00"),
NOON_TO_3PM("12:00 - 15:00"),
THREE_PM_TO_6PM("15:00 - 18:00"),
SIX_PM_TO_9PM("18:00 - 21:00"),
NINE_PM_TO_MIDNIGHT("21:00 - 00:00");

private final String timeRange;

OpenTime(String timeRange) {
this.timeRange = timeRange;
}

}
34 changes: 34 additions & 0 deletions src/main/java/com/dongyang/dongpo/domain/store/Store.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dongyang.dongpo.domain.store;

import com.dongyang.dongpo.domain.member.Member;
import com.dongyang.dongpo.dto.store.OpenPossibility;
import com.dongyang.dongpo.dto.store.ReviewDto;
import com.dongyang.dongpo.dto.store.StoreDto;
import com.dongyang.dongpo.dto.store.StoreUpdateDto;
Expand Down Expand Up @@ -80,6 +81,7 @@ public enum PayMethod {
CASH, CARD, TRANSFER
}


public StoreDto toResponse() {
List<Store.OperatingDay> operatingDayValues = this.storeOperatingDays.stream()
.map(StoreOperatingDay::getOperatingDay)
Expand Down Expand Up @@ -111,6 +113,38 @@ public StoreDto toResponse() {
.build();
}

public StoreDto toResponse(OpenPossibility openPossibility) {
List<Store.OperatingDay> operatingDayValues = this.storeOperatingDays.stream()
.map(StoreOperatingDay::getOperatingDay)
.collect(Collectors.toList());

List<Store.PayMethod> payMethodValues = this.storePayMethods.stream()
.map(StorePayMethod::getPayMethod)
.collect(Collectors.toList());

List<ReviewDto> reviewDtos = this.reviews.stream()
.map(StoreReview::toResponse)
.toList();

return StoreDto.builder()
.id(id)
.name(name)
.address(address)
.latitude(latitude)
.longitude(longitude)
.reportCount(reportCount)
.memberId(member.getId())
.openTime(openTime)
.closeTime(closeTime)
.isToiletValid(isToiletValid)
.operatingDays(operatingDayValues)
.payMethods(payMethodValues)
.status(status)
.reviews(reviewDtos)
.openPossibility(openPossibility)
.build();
}

public void update(StoreUpdateDto updateDto){
this.name = updateDto.getName();
this.openTime = updateDto.getOpenTime();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import jakarta.persistence.*;
import lombok.*;

import java.time.DayOfWeek;
import java.time.LocalDateTime;

@Entity
Expand Down Expand Up @@ -34,4 +35,12 @@ public class StoreVisitCert {

@Column(columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP")
private LocalDateTime certDate;

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "VARCHAR(255)")
private DayOfWeek openDay;

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "VARCHAR(255)")
private OpenTime openTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dongyang.dongpo.dto.store;

public enum OpenPossibility {

HIGH,
NONE
}
1 change: 1 addition & 0 deletions src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ public class StoreDto {
private List<Store.OperatingDay> operatingDays;
private List<Store.PayMethod> payMethods;
private List<ReviewDto> reviews;
private OpenPossibility openPossibility;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public interface StoreVisitCertRepository extends JpaRepository<StoreVisitCert,
"ORDER BY visitCount DESC")
List<Object[]> findTop10MembersBySuccessfulVisitCount(Pageable pageable);

List<StoreVisitCert> findByStoreAndAndIsVisitSuccessfulTrue(Store store);

Long countByStoreAndIsVisitSuccessfulTrue(Store store); // 점포 방문인증 성공 카운트
Long countByMemberAndIsVisitSuccessfulIsTrue(Member member); // 방문 인증 성공 카운트
Long countByMemberAndIsVisitSuccessfulIsFalse(Member member); // 방문 인증 실패 카운트
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.dongyang.dongpo.domain.member.Member;
import com.dongyang.dongpo.domain.member.Title;
import com.dongyang.dongpo.domain.store.OpenTime;
import com.dongyang.dongpo.domain.store.Store;
import com.dongyang.dongpo.domain.store.StoreVisitCert;
import com.dongyang.dongpo.dto.location.LatLong;
Expand All @@ -18,6 +19,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.DayOfWeek;
import java.time.LocalDateTime;

@Service
Expand Down Expand Up @@ -76,12 +78,17 @@ public Boolean verifyVisitCert(LatLongComparisonDto latLongComparison, Member me

boolean verify = calcDistance(newCoordinate, getStoreCoordinates(latLongComparison.getTargetStoreId())) <= 50;
Store store = storeRepository.findById(latLongComparison.getTargetStoreId()).orElseThrow(() -> new CustomException(ErrorCode.STORE_NOT_FOUND));

LocalDateTime now = LocalDateTime.now();
OpenTime openTime = getOpenTime(now);
if (verify){
storeVisitCertRepository.save(StoreVisitCert.builder()
.store(store)
.member(member)
.isVisitSuccessful(true)
.certDate(LocalDateTime.now())
.certDate(now)
.openDay(now.getDayOfWeek())
.openTime(openTime)
.build());

Long successCount = storeVisitCertRepository.countByMemberAndIsVisitSuccessfulIsTrue(member);
Expand All @@ -96,7 +103,9 @@ else if (successCount.equals(3L))
.store(store)
.member(member)
.isVisitSuccessful(false)
.certDate(LocalDateTime.now())
.certDate(now)
.openDay(now.getDayOfWeek())
.openTime(openTime)
.build());

Long failCount = storeVisitCertRepository.countByMemberAndIsVisitSuccessfulIsFalse(member);
Expand Down Expand Up @@ -140,4 +149,25 @@ public Boolean verifyStoreRegistration(StoreRegisterDto request) {
// 오차가 100m 이내일 경우 true, 초과일 경우 false 반환
return calcDistance(userCord, storeCord) <= 100;
}

// 오픈 시간대 반환
private OpenTime getOpenTime(LocalDateTime now){
int hour = now.getHour();
if (hour < 3)
return OpenTime.MIDNIGHT_TO_3AM;
else if (hour < 6)
return OpenTime.THREE_AM_TO_6AM;
else if (hour < 9)
return OpenTime.SIX_AM_TO_9AM;
else if (hour < 12)
return OpenTime.NINE_AM_TO_NOON;
else if (hour < 15)
return OpenTime.NOON_TO_3PM;
else if (hour < 18)
return OpenTime.THREE_PM_TO_6PM;
else if (hour < 21)
return OpenTime.SIX_PM_TO_9PM;
else
return OpenTime.NINE_PM_TO_MIDNIGHT;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.dongyang.dongpo.service.open;

import com.dongyang.dongpo.domain.store.OpenTime;
import com.dongyang.dongpo.domain.store.Store;
import com.dongyang.dongpo.dto.store.OpenPossibility;
import com.dongyang.dongpo.repository.store.StoreVisitCertRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.List;

@Service
@RequiredArgsConstructor
public class OpenPossibilityService {

private final StoreVisitCertRepository storeVisitCertRepository;

public OpenPossibility getOpenPossibility(Store store) {
LocalDateTime now = LocalDateTime.now();
DayOfWeek dayOfWeek = now.getDayOfWeek(); // 현재 요일
OpenTime openTime = getOpenTime(now); // 현재 시간대

// 해당 점포 방문인증 성공한 데이터만 조회
List<OpenPossibility> possibilities = storeVisitCertRepository.findByStoreAndAndIsVisitSuccessfulTrue(store)
.stream()
.map(s -> {
if (s.getOpenTime().equals(openTime) && s.getOpenDay().equals(dayOfWeek))
return OpenPossibility.HIGH; // 성공한 경우
else
return OpenPossibility.NONE; // 실패한 경우
})
.toList(); // 결과를 리스트로 수집

if (possibilities.contains(OpenPossibility.HIGH))
return OpenPossibility.HIGH; // 하나라도 HIGH가 있으면 HIGH 반환
else
return OpenPossibility.NONE; // 모두 NONE이면 NONE 반환

}

private OpenTime getOpenTime(LocalDateTime now){
int hour = now.getHour();
if (hour < 3)
return OpenTime.MIDNIGHT_TO_3AM;
else if (hour < 6)
return OpenTime.THREE_AM_TO_6AM;
else if (hour < 9)
return OpenTime.SIX_AM_TO_9AM;
else if (hour < 12)
return OpenTime.NINE_AM_TO_NOON;
else if (hour < 15)
return OpenTime.NOON_TO_3PM;
else if (hour < 18)
return OpenTime.THREE_PM_TO_6PM;
else if (hour < 21)
return OpenTime.SIX_PM_TO_9PM;
else
return OpenTime.NINE_PM_TO_MIDNIGHT;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.dongyang.dongpo.domain.store.StorePayMethod;
import com.dongyang.dongpo.dto.location.CoordinateRange;
import com.dongyang.dongpo.dto.location.LatLong;
import com.dongyang.dongpo.dto.store.OpenPossibility;
import com.dongyang.dongpo.dto.store.StoreDto;
import com.dongyang.dongpo.dto.store.StoreRegisterDto;
import com.dongyang.dongpo.dto.store.StoreUpdateDto;
Expand All @@ -16,6 +17,7 @@
import com.dongyang.dongpo.repository.store.StorePayMethodRepository;
import com.dongyang.dongpo.repository.store.StoreRepository;
import com.dongyang.dongpo.service.location.LocationService;
import com.dongyang.dongpo.service.open.OpenPossibilityService;
import com.dongyang.dongpo.service.title.TitleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -37,6 +39,7 @@ public class StoreService {
private final StoreOperatingDayRepository storeOperatingDayRepository;
private final LocationService locationService;
private final TitleService titleService;
private final OpenPossibilityService openPossibilityService;


@Transactional
Expand Down Expand Up @@ -93,7 +96,9 @@ public List<StoreDto> findStoresByCurrentLocation(LatLong latLong) {
public StoreDto detailStore(Long id) {
Store store = storeRepository.findById(id)
.orElseThrow(() -> new CustomException(ErrorCode.STORE_NOT_FOUND));
return store.toResponse();
OpenPossibility openPossibility = openPossibilityService.getOpenPossibility(store);

return store.toResponse(openPossibility);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import com.dongyang.dongpo.domain.store.Store;
import com.dongyang.dongpo.domain.store.StoreOperatingDay;
import com.dongyang.dongpo.domain.store.StorePayMethod;
import com.dongyang.dongpo.dto.store.OpenPossibility;
import com.dongyang.dongpo.dto.store.StoreDto;
import com.dongyang.dongpo.dto.store.StoreRegisterDto;
import com.dongyang.dongpo.repository.store.StoreOperatingDayRepository;
import com.dongyang.dongpo.repository.store.StorePayMethodRepository;
import com.dongyang.dongpo.repository.store.StoreRepository;
import com.dongyang.dongpo.service.location.LocationService;
import com.dongyang.dongpo.service.open.OpenPossibilityService;
import com.dongyang.dongpo.service.title.TitleService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -44,6 +46,9 @@ class StoreServiceTest {
@Mock
private LocationService locationService;

@Mock
private OpenPossibilityService openPossibilityService;


@Test
@DisplayName("점포_등록")
Expand Down Expand Up @@ -90,8 +95,10 @@ void detailStore() {
// given
Store store = mock(Store.class);
Optional<Store> optionalStore = Optional.of(store);
OpenPossibility openPossibility = mock(OpenPossibility.class);

when(storeRepository.findById(any())).thenReturn(optionalStore);
when(openPossibilityService.getOpenPossibility(any())).thenReturn(openPossibility);

// when
storeService.detailStore(store.getId());
Expand Down

0 comments on commit f4bc1ef

Please sign in to comment.