diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java index 651693e..9a543dc 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java @@ -67,4 +67,9 @@ public void getPathAndItems(@DestinationVariable String tripId, @Payload PathAnd public void updateTripBudget(@DestinationVariable String tripId, @Payload TripBudgetUpdateMsg tripBudgetUpdateMsg) { tripService.updateTripBudget(tripId, tripBudgetUpdateMsg); } + + @MessageMapping("/trips/{tripId}/updateTransportation") + public void updateTransportation(@DestinationVariable String tripId, @Payload TripTransportationUpdateMsg tripTransportationUpdateMsg) { + tripService.updateTripTransportation(tripId, tripTransportationUpdateMsg); + } } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java index 0aea6d4..0aa9d04 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.RestController; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemDeleteMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; -import org.tenten.tentenstomp.domain.trip.dto.request.TripItemTransportationUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; import org.tenten.tentenstomp.domain.trip.service.TripItemService; @@ -28,11 +27,6 @@ public void updateTripItemVisitDate(@DestinationVariable String tripItemId, @Pay tripItemService.updateTripItemVisitDate(tripItemId, visitDateUpdateMsg); } - @MessageMapping("/tripItems/{tripItemId}/updateTransportation") - public void updateTripItemTransportation(@DestinationVariable String tripItemId, @Payload TripItemTransportationUpdateMsg tripItemTransportationUpdateMsg) { - tripItemService.updateTripItemTransportation(tripItemId, tripItemTransportationUpdateMsg); - } - @MessageMapping("/tripItems/{tripItemId}/deleteItem") public void deleteTripItem(@DestinationVariable String tripItemId, @Payload TripItemDeleteMsg tripItemDeleteMsg) { tripItemService.deleteTripItem(tripItemId, tripItemDeleteMsg); diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripTransportationUpdateMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripTransportationUpdateMsg.java new file mode 100644 index 0000000..b90731f --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripTransportationUpdateMsg.java @@ -0,0 +1,9 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +import org.tenten.tentenstomp.global.common.enums.Transportation; + +public record TripTransportationUpdateMsg( + String visitDate, + Transportation transportation +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfo.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfo.java index 1ebb9a5..03bb26c 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfo.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfo.java @@ -1,7 +1,5 @@ package org.tenten.tentenstomp.domain.trip.dto.response; -import org.tenten.tentenstomp.global.common.enums.Transportation; - import java.time.LocalDate; public record TripItemInfo( @@ -10,7 +8,6 @@ public record TripItemInfo( String name, String thumbnailUrl, Long contentTypeId, - Transportation transportation, Long seqNum, LocalDate visitDate, Long price diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java index aa37fbb..a9c260d 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java @@ -1,16 +1,11 @@ package org.tenten.tentenstomp.domain.trip.dto.response; -import org.tenten.tentenstomp.global.common.enums.Transportation; - -import java.time.LocalDate; - public record TripItemInfoMsg( Long tripItemId, Long tourItemId, String name, String thumbnailUrl, String category, - Transportation transportation, Long seqNum, String visitDate, Long price diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java index 19fe2ff..8a390da 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java @@ -1,7 +1,5 @@ package org.tenten.tentenstomp.domain.trip.dto.response; -import org.tenten.tentenstomp.global.common.enums.Transportation; - public record TripPathInfoMsg( Long fromTripItemId, Long toTripItemId, @@ -11,7 +9,6 @@ public record TripPathInfoMsg( String fromLatitude, String toLongitude, String toLatitude, - Transportation transportation, PathInfo pathInfo ) { diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java index 6e6347f..eb7a0fa 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java @@ -9,6 +9,7 @@ import org.tenten.tentenstomp.domain.trip.dto.request.TripUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; import org.tenten.tentenstomp.global.common.BaseTimeEntity; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.common.enums.TripStatus; import org.tenten.tentenstomp.global.converter.MapConverter; @@ -50,6 +51,9 @@ public class Trip extends BaseTimeEntity { @Convert(converter = MapConverter.class) @Column(columnDefinition = "JSON") private Map tripPathPriceMap; + @Convert(converter = MapConverter.class) + @Column(columnDefinition = "JSON") + private Map tripTransportationMap; @OneToMany(mappedBy = "trip", fetch = LAZY, cascade = REMOVE) private final List tripMembers = new ArrayList<>(); @@ -70,7 +74,7 @@ public TripInfoMsg changeTripInfo(TripUpdateMsg request) { this.budget = request.budget(); LocalDate currentDate = LocalDate.now(); - TripStatus tripStatus = null; + TripStatus tripStatus; if (currentDate.isBefore(this.startDate)) { tripStatus = BEFORE; } else if (currentDate.isAfter(this.endDate)) { diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/TripItem.java b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/TripItem.java index e9d2f04..b2a4399 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/TripItem.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/TripItem.java @@ -6,14 +6,11 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; -import org.tenten.tentenstomp.domain.member.entity.Member; import org.tenten.tentenstomp.domain.tour.entity.TourItem; import org.tenten.tentenstomp.global.common.BaseTimeEntity; -import org.tenten.tentenstomp.global.common.enums.Transportation; import java.time.LocalDate; -import static jakarta.persistence.EnumType.STRING; import static jakarta.persistence.GenerationType.IDENTITY; import static jakarta.persistence.InheritanceType.JOINED; @@ -29,8 +26,6 @@ public class TripItem extends BaseTimeEntity { @Column(name = "tripItemId") private Long id; - @Enumerated(STRING) - private Transportation transportation; private Long seqNum; // 방문 순서 private LocalDate visitDate; @ColumnDefault("0") @@ -56,11 +51,4 @@ public void updatePrice(Long price) { public void updateVisitDate(LocalDate visitDate) { this.visitDate = visitDate; } - - public void updateTransportation(Transportation transportation) { - this.transportation = transportation; - } - public int compareWithSeqNum(TripItem compare) { - return Long.compare(this.seqNum, compare.seqNum); - } } \ No newline at end of file diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/repository/MessageProxyRepositoryImpl.java b/src/main/java/org/tenten/tentenstomp/domain/trip/repository/MessageProxyRepositoryImpl.java index 7ebfdf2..ffb1e09 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/repository/MessageProxyRepositoryImpl.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/repository/MessageProxyRepositoryImpl.java @@ -9,6 +9,7 @@ import org.tenten.tentenstomp.domain.trip.entity.Trip; import org.tenten.tentenstomp.global.cache.RedisCache; import org.tenten.tentenstomp.global.common.enums.Category; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.component.PathComponent; import org.tenten.tentenstomp.global.component.dto.response.TripPathCalculationResult; @@ -18,6 +19,7 @@ import java.util.Map; import static org.tenten.tentenstomp.global.common.constant.TopicConstant.*; +import static org.tenten.tentenstomp.global.common.enums.Transportation.CAR; @Repository @RequiredArgsConstructor @@ -64,7 +66,7 @@ public TripItemMsg getTripItemMsg(Long tripId, String visitDate) { } List tripInfos = tripItemRepository.getTripItemInfoByTripIdAndVisitDate(tripId, LocalDate.parse(visitDate)); List tripItemInfoMsgs = tripInfos.stream().map(t -> new TripItemInfoMsg( - t.tripItemId(), t.tourItemId(), t.name(), t.thumbnailUrl(), Category.fromCode(t.contentTypeId()).getName(), t.transportation(), t.seqNum(), t.visitDate().toString(), t.price() + t.tripItemId(), t.tourItemId(), t.name(), t.thumbnailUrl(), Category.fromCode(t.contentTypeId()).getName(), t.seqNum(), t.visitDate().toString(), t.price() )).toList(); TripItemMsg tripItemMsg = new TripItemMsg(tripId, visitDate, tripItemInfoMsgs); redisCache.save(TRIP_ITEM, Long.toString(tripId), visitDate, tripItemMsg); @@ -77,7 +79,10 @@ public TripPathMsg getTripPathMsg(Long tripId, String visitDate) { if (cached != null) { return objectMapper.convertValue(cached, TripPathMsg.class); } - TripPathCalculationResult tripPath = pathComponent.getTripPath(tripItemRepository.findTripPlaceByTripIdAndVisitDate(tripId, LocalDate.parse(visitDate))); + Trip trip = tripRepository.getReferenceById(tripId); + Map tripTransportationMap = trip.getTripTransportationMap(); + Transportation transportation = tripTransportationMap.getOrDefault(visitDate, CAR); + TripPathCalculationResult tripPath = pathComponent.getTripPath(tripItemRepository.findTripPlaceByTripIdAndVisitDate(tripId, LocalDate.parse(visitDate)), transportation); TripPathMsg tripPathMsg = new TripPathMsg(tripId, visitDate, tripPath.tripPathInfoMsgs()); redisCache.save(PATH, Long.toString(tripId), visitDate, tripPathMsg); return tripPathMsg; diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/repository/TripItemRepository.java b/src/main/java/org/tenten/tentenstomp/domain/trip/repository/TripItemRepository.java index 90b54b3..8587d15 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/repository/TripItemRepository.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/repository/TripItemRepository.java @@ -16,14 +16,14 @@ public interface TripItemRepository extends JpaRepository { @Query("SELECT NEW org.tenten.tentenstomp.domain.trip.dto.response.TripItemInfo(" + - "ti.id, t.id, t.title, t.originalThumbnailUrl, t.contentTypeId, ti.transportation, ti.seqNum, ti.visitDate, ti.price" + + "ti.id, t.id, t.title, t.originalThumbnailUrl, t.contentTypeId, ti.seqNum, ti.visitDate, ti.price" + ") FROM TripItem ti LEFT OUTER JOIN TourItem t ON ti.tourItem.id = t.id WHERE ti.trip.id = :tripId AND ti.visitDate = :visitDate ORDER BY ti.seqNum ASC") List getTripItemInfoByTripIdAndVisitDate(@Param("tripId") Long tripId, @Param("visitDate") LocalDate visitDate); @Lock(PESSIMISTIC_WRITE) @Query("SELECT ti FROM TripItem ti JOIN FETCH ti.tourItem WHERE ti.trip.id = :tripId AND ti.visitDate = :visitDate ORDER BY ti.seqNum ASC") List findTripItemByTripIdAndVisitDate(@Param("tripId") Long tripId, @Param("visitDate") LocalDate visitDate); @Query("SELECT NEW org.tenten.tentenstomp.global.component.dto.request.TripPlace(" + - "ti.id, ti.seqNum, ti.transportation, t.longitude, t.latitude, ti.price" + + "ti.id, ti.seqNum, t.longitude, t.latitude, ti.price" + ") FROM TripItem ti LEFT OUTER JOIN TourItem t ON ti.tourItem.id = t.id WHERE ti.trip.id = :tripId AND ti.visitDate = :visitDate ORDER BY ti.seqNum ASC") List findTripPlaceByTripIdAndVisitDate(@Param("tripId") Long tripId, @Param("visitDate") LocalDate visitDate); @Lock(PESSIMISTIC_WRITE) diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java index e19f3e8..9204644 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java @@ -5,7 +5,6 @@ import org.springframework.transaction.annotation.Transactional; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemDeleteMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; -import org.tenten.tentenstomp.domain.trip.dto.request.TripItemTransportationUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.response.TripBudgetMsg; import org.tenten.tentenstomp.domain.trip.dto.response.TripItemMsg; @@ -15,6 +14,7 @@ import org.tenten.tentenstomp.domain.trip.repository.MessageProxyRepository; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; import org.tenten.tentenstomp.domain.trip.repository.TripRepository; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.component.PathComponent; import org.tenten.tentenstomp.global.component.dto.request.TripPlace; import org.tenten.tentenstomp.global.component.dto.response.TripPathCalculationResult; @@ -26,6 +26,8 @@ import java.util.Map; import java.util.Optional; +import static org.tenten.tentenstomp.global.common.enums.Transportation.CAR; + @Service @RequiredArgsConstructor public class TripItemService { @@ -51,7 +53,7 @@ public void updateTripItemPrice(String tripItemId, TripItemPriceUpdateMsg priceU Trip trip = tripItem.getTrip(); trip.updateTripItemPriceSum(oldPrice, newPrice); tripItem.updatePrice(newPrice); - List tripItems = trip.getTripItems(); + List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripItem.getTrip().getId(), LocalDate.parse(priceUpdateMsg.visitDate())); TripBudgetMsg tripBudgetMsg = new TripBudgetMsg(trip.getId(), trip.getBudget(), trip.getTripItemPriceSum() + trip.getTransportationPriceSum()); TripItemMsg tripItemMsg = TripItemMsg.fromTripItemList(trip.getId(), tripItem.getVisitDate().toString(), tripItems, tripItem.getId(), priceUpdateMsg); kafkaProducer.sendAndSaveToRedis(tripBudgetMsg, tripItemMsg); @@ -74,8 +76,11 @@ public void updateTripItemVisitDate(String tripItemId, TripItemVisitDateUpdateMs } else { TripItem tripItem = optionalTripItem.get(); Trip trip = tripRepository.getReferenceById(tripItem.getTrip().getId()); + Map tripTransportationMap = trip.getTripTransportationMap(); LocalDate pastDate = tripItem.getVisitDate(); + Transportation pastDateTransportation = tripTransportationMap.getOrDefault(pastDate.toString(), CAR); LocalDate newDate = LocalDate.parse(visitDateUpdateMsg.newVisitDate()); + Transportation newDateTransportation = tripTransportationMap.getOrDefault(newDate.toString(), CAR); List pastDateTripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripItem.getTrip().getId(), pastDate); List newDateTripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripItem.getTrip().getId(), newDate); @@ -97,8 +102,8 @@ public void updateTripItemVisitDate(String tripItemId, TripItemVisitDateUpdateMs tripItem.updateVisitDate(LocalDate.parse(visitDateUpdateMsg.newVisitDate())); newDateTripItems.add(tripItem); - TripPathCalculationResult pastDateTripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newPastDateTripItems)); - TripPathCalculationResult newDateTripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newDateTripItems)); + TripPathCalculationResult pastDateTripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newPastDateTripItems), pastDateTransportation); + TripPathCalculationResult newDateTripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newDateTripItems), newDateTransportation); Map tripPathPriceMap = trip.getTripPathPriceMap(); trip.updateTransportationPriceSum(tripPathPriceMap.getOrDefault(pastDate.toString(), 0), pastDateTripPath.pathPriceSum()); @@ -131,8 +136,10 @@ public void deleteTripItem(String tripItemId, TripItemDeleteMsg tripItemDeleteMs } else { TripItem tripItem = optionalTripItem.get(); Trip trip = tripRepository.getReferenceById(tripItem.getTrip().getId()); + Map tripTransportationMap = trip.getTripTransportationMap(); LocalDate visitDate = tripItem.getVisitDate(); + Transportation transportation = tripTransportationMap.getOrDefault(visitDate.toString(), CAR); List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripItem.getTrip().getId(), visitDate); Long seqNum = tripItem.getSeqNum(); @@ -148,7 +155,7 @@ public void deleteTripItem(String tripItemId, TripItemDeleteMsg tripItemDeleteMs } tripItemRepository.delete(tripItem); - TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newTripItems)); + TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(newTripItems), transportation); Map tripPathPriceMap = trip.getTripPathPriceMap(); trip.updateTransportationPriceSum(tripPathPriceMap.getOrDefault(visitDate.toString(), 0), tripPath.pathPriceSum()); tripPathPriceMap.put(visitDate.toString(), tripPath.pathPriceSum()); @@ -164,45 +171,4 @@ public void deleteTripItem(String tripItemId, TripItemDeleteMsg tripItemDeleteMs } - @Transactional - public void updateTripItemTransportation(String tripItemId, TripItemTransportationUpdateMsg tripItemTransportationUpdateMsg) { - Optional optionalTripItem = tripItemRepository.findTripItemForUpdate(Long.parseLong(tripItemId)); - if (optionalTripItem.isEmpty()) { - Trip trip = tripRepository.getReferenceById(tripItemTransportationUpdateMsg.tripId()); - kafkaProducer.sendWithOutCaching( - messageProxyRepository.getTripItemMsg(trip.getId(), tripItemTransportationUpdateMsg.visitDate()), - messageProxyRepository.getTripPathMsg(trip.getId(), tripItemTransportationUpdateMsg.visitDate()), - messageProxyRepository.getTripBudgetMsg(trip) - ); - } else { - TripItem tripItem = optionalTripItem.get(); - Trip trip = tripRepository.getReferenceById(tripItem.getTrip().getId()); - - LocalDate visitDate = tripItem.getVisitDate(); - List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripItem.getTrip().getId(), visitDate); - for (TripItem newTripItem : tripItems) { - if (newTripItem.getId().equals(tripItem.getId())) { - newTripItem.updateTransportation(tripItemTransportationUpdateMsg.transportation()); - } - } - - tripItem.updateTransportation(tripItemTransportationUpdateMsg.transportation()); - tripItemRepository.save(tripItem); - - TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(tripItems)); - Map tripPathPriceMap = trip.getTripPathPriceMap(); - trip.updateTransportationPriceSum(tripPathPriceMap.getOrDefault(visitDate.toString(), 0), tripPath.pathPriceSum()); - tripPathPriceMap.put(visitDate.toString(), tripPath.pathPriceSum()); - tripRepository.save(trip); - - TripItemMsg tripItemMsg = TripItemMsg.fromTripItemList(trip.getId(), visitDate.toString(), tripItems); - TripPathMsg tripPathMsg = new TripPathMsg(trip.getId(), visitDate.toString(), tripPath.tripPathInfoMsgs()); - TripBudgetMsg tripBudgetMsg = new TripBudgetMsg(trip.getId(), trip.getBudget(), trip.getTripItemPriceSum() + trip.getTransportationPriceSum()); - - kafkaProducer.sendAndSaveToRedis(tripItemMsg, tripPathMsg, tripBudgetMsg); - } - - } - - } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index 7016522..81dbbe5 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -14,6 +14,7 @@ import org.tenten.tentenstomp.domain.trip.repository.MessageProxyRepository; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; import org.tenten.tentenstomp.domain.trip.repository.TripRepository; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.common.enums.TripStatus; import org.tenten.tentenstomp.global.component.PathComponent; import org.tenten.tentenstomp.global.component.dto.request.TripPlace; @@ -26,6 +27,7 @@ import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.tenten.tentenstomp.global.common.constant.TopicConstant.*; +import static org.tenten.tentenstomp.global.common.enums.Transportation.CAR; import static org.tenten.tentenstomp.global.common.enums.TripStatus.*; @Service @@ -127,7 +129,9 @@ public void addTripItem(String tripId, TripItemAddMsg tripItemAddMsg) { } private void updateBudgetAndItemsAndPath(Trip trip, List tripItems, String visitDate) { - TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(tripItems)); + Map tripTransportationMap = trip.getTripTransportationMap(); + Transportation transportation = tripTransportationMap.getOrDefault(visitDate, CAR); + TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(tripItems), transportation); Map tripPathPriceMap = trip.getTripPathPriceMap(); trip.updateTransportationPriceSum(tripPathPriceMap.getOrDefault(visitDate, 0), tripPath.pathPriceSum()); tripPathPriceMap.put(visitDate, tripPath.pathPriceSum()); @@ -147,7 +151,7 @@ public void updateTripItemOrder(String tripId, TripItemOrderUpdateMsg orderUpdat for (OrderInfo orderInfo : orderUpdateMsg.tripItemOrder()) { itemOrderMap.put(orderInfo.tripItemId(), orderInfo.seqNum()); } - List tripItems = trip.getTripItems(); + List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(trip.getId(), LocalDate.parse(orderUpdateMsg.visitDate())); for (TripItem tripItem : tripItems) { tripItem.updateSeqNum(itemOrderMap.get(tripItem.getId())); } @@ -182,5 +186,26 @@ public void updateTripBudget(String tripId, TripBudgetUpdateMsg tripBudgetUpdate kafkaProducer.sendAndSaveToRedis(tripBudgetMsg, tripInfoMsg); } + @Transactional + public void updateTripTransportation(String tripId, TripTransportationUpdateMsg tripTransportationUpdateMsg) { + Trip trip = tripRepository.findTripForUpdate(Long.parseLong(tripId)).orElseThrow(() -> new GlobalException("해당 아이디로 존재하는 여정이 없습니다 " + tripId, NOT_FOUND)); + Map tripTransportationMap = trip.getTripTransportationMap(); + String visitDate = tripTransportationUpdateMsg.visitDate(); + List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(trip.getId(), LocalDate.parse(visitDate)); + + TripPathCalculationResult tripPath = pathComponent.getTripPath(TripPlace.fromTripItems(tripItems), tripTransportationUpdateMsg.transportation()); + Map tripPathPriceMap = trip.getTripPathPriceMap(); + trip.updateTransportationPriceSum(tripPathPriceMap.getOrDefault(visitDate, 0), tripPath.pathPriceSum()); + + tripTransportationMap.put(visitDate, tripTransportationUpdateMsg.transportation()); + tripPathPriceMap.put(visitDate, tripPath.pathPriceSum()); + tripRepository.save(trip); + + TripBudgetMsg tripBudgetMsg = new TripBudgetMsg(trip.getId(), trip.getBudget(), trip.getTripItemPriceSum() + trip.getTransportationPriceSum()); + TripItemMsg tripItemMsg = TripItemMsg.fromTripItemList(trip.getId(), visitDate, tripItems); + TripPathMsg tripPathMsg = new TripPathMsg(trip.getId(), visitDate, tripPath.tripPathInfoMsgs()); + + kafkaProducer.sendAndSaveToRedis(tripBudgetMsg, tripItemMsg, tripPathMsg); + } } diff --git a/src/main/java/org/tenten/tentenstomp/global/common/enums/Transportation.java b/src/main/java/org/tenten/tentenstomp/global/common/enums/Transportation.java index 900fcf1..026fa12 100644 --- a/src/main/java/org/tenten/tentenstomp/global/common/enums/Transportation.java +++ b/src/main/java/org/tenten/tentenstomp/global/common/enums/Transportation.java @@ -1,5 +1,23 @@ package org.tenten.tentenstomp.global.common.enums; +import lombok.Getter; + +@Getter public enum Transportation { - CAR, PUBLIC_TRANSPORTATION; -} \ No newline at end of file + CAR("CAR"), PUBLIC_TRANSPORTATION("PUBLIC_TRANSPORTATION"); + + private final String name; + + Transportation(String name) { + this.name = name; + } + + public static Transportation fromName(String name) { + for (Transportation t : Transportation.values()) { + if (t.getName().equals(name)) { + return t; + } + } + return null; + } +} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/AsyncPathComponent.java b/src/main/java/org/tenten/tentenstomp/global/component/AsyncPathComponent.java index f0a041f..56e2a66 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/AsyncPathComponent.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/AsyncPathComponent.java @@ -5,6 +5,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.component.dto.request.TripPlace; import java.util.List; @@ -17,17 +18,18 @@ public class AsyncPathComponent { private final OdsayComponent odsayComponent; private final NaverMapComponent naverMapComponent; + @Async("pathTaskExecutor") - public void calculatePath(TripPlace fromPlace, TripPlace toPlace, List pathInfoMsgs) { + public void calculatePath(TripPlace fromPlace, TripPlace toPlace, List pathInfoMsgs, Transportation transportation) { long startTime = System.currentTimeMillis(); TripPathInfoMsg.PathInfo pathInfo; - if (toPlace.transportation().equals(CAR)) { + if (transportation.equals(CAR)) { pathInfo = naverMapComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); } else { pathInfo = odsayComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); } log.info("from " + fromPlace.seqNum() + " to " + toPlace.seqNum() + " executionTime : " + ((System.currentTimeMillis() - startTime) / 1000.0)); - pathInfoMsgs.add(new TripPathInfoMsg(fromPlace.tripItemId(), toPlace.tripItemId(), fromPlace.seqNum(), toPlace.seqNum(), fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude(), toPlace.transportation(), pathInfo)); + pathInfoMsgs.add(new TripPathInfoMsg(fromPlace.tripItemId(), toPlace.tripItemId(), fromPlace.seqNum(), toPlace.seqNum(), fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude(), pathInfo)); } } diff --git a/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java b/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java index 8e49f1f..074c64d 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg; import org.tenten.tentenstomp.global.common.annotation.GetExecutionTime; +import org.tenten.tentenstomp.global.common.enums.Transportation; import org.tenten.tentenstomp.global.component.dto.request.PathCalculateRequest; import org.tenten.tentenstomp.global.component.dto.request.TripPlace; import org.tenten.tentenstomp.global.component.dto.response.TripPathCalculationResult; @@ -21,12 +22,13 @@ public class PathComponent { @GetExecutionTime - public TripPathCalculationResult getTripPath(List tripPlaceList) { + public TripPathCalculationResult getTripPath(List tripPlaceList, Transportation transportation) { + List pathCalculateRequests = toPathCalculateRequest(tripPlaceList); Integer priceSum = 0; List pathInfoMsgs = new CopyOnWriteArrayList<>(); for (PathCalculateRequest calculateRequest : pathCalculateRequests) { - asyncPathComponent.calculatePath(calculateRequest.from(), calculateRequest.to(), pathInfoMsgs); + asyncPathComponent.calculatePath(calculateRequest.from(), calculateRequest.to(), pathInfoMsgs, transportation); } while (true) { if (pathInfoMsgs.size() == pathCalculateRequests.size()) { diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java index 4ce291b..96b0bb6 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java @@ -1,19 +1,17 @@ package org.tenten.tentenstomp.global.component.dto.request; import org.tenten.tentenstomp.domain.trip.entity.TripItem; -import org.tenten.tentenstomp.global.common.enums.Transportation; import java.util.List; public record TripPlace( Long tripItemId, Long seqNum, - Transportation transportation, String longitude, String latitude, Long price ) { public static List fromTripItems(List tripItems) { - return tripItems.stream().map(t -> new TripPlace(t.getId(), t.getSeqNum(), t.getTransportation(), t.getTourItem().getLongitude(), t.getTourItem().getLatitude(), t.getPrice())).toList(); + return tripItems.stream().map(t -> new TripPlace(t.getId(), t.getSeqNum(), t.getTourItem().getLongitude(), t.getTourItem().getLatitude(), t.getPrice())).toList(); } } diff --git a/src/main/java/org/tenten/tentenstomp/global/converter/MapConverter.java b/src/main/java/org/tenten/tentenstomp/global/converter/MapConverter.java index 2294e41..0143a12 100644 --- a/src/main/java/org/tenten/tentenstomp/global/converter/MapConverter.java +++ b/src/main/java/org/tenten/tentenstomp/global/converter/MapConverter.java @@ -9,7 +9,7 @@ import java.util.Map; @Converter -public class MapConverter implements AttributeConverter, String> { +public class MapConverter implements AttributeConverter { protected final ObjectMapper objectMapper; public MapConverter() { @@ -28,11 +28,11 @@ public String convertToDatabaseColumn(Map map) { } } @Override - public Map convertToEntityAttribute(String s) { + public Map convertToEntityAttribute(String s) { if (StringUtils.hasText(s)) { try { - return (Map) objectMapper.readValue(s, Map.class); // 5 + return objectMapper.readValue(s, Map.class); // 5 } catch (Exception e) { throw new RuntimeException(e); }