From f7fb9c1740d10e6dc2024f0c2cc1d8510bd5e380 Mon Sep 17 00:00:00 2001 From: yyy9942 Date: Wed, 15 Jan 2020 12:33:18 +0900 Subject: [PATCH 01/13] =?UTF-8?q?=EB=B0=B0=EB=8B=AC=20=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/delfood/FoodDeliveryApplication.java | 2 + src/main/java/com/delfood/dao/FcmDao.java | 32 +++++ .../delfood/dao/deliveery/DeliveryDao.java | 23 ++++ .../dao/deliveery/MultiThreadDeliveryDao.java | 110 ++++++++++++++++++ .../com/delfood/dto/push/PushMessage.java | 3 +- .../delfood/dto/rider/DeliveryRiderDTO.java | 20 ++++ .../java/com/delfood/service/PushService.java | 31 +++++ .../service/delivery/DeliveryService.java | 64 ++++++++++ .../com/delfood/utils/RedisKeyFactory.java | 6 +- 9 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/delfood/dao/deliveery/DeliveryDao.java create mode 100644 src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java create mode 100644 src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java create mode 100644 src/main/java/com/delfood/service/delivery/DeliveryService.java diff --git a/src/main/java/com/delfood/FoodDeliveryApplication.java b/src/main/java/com/delfood/FoodDeliveryApplication.java index 95deb53..f9ed2e0 100644 --- a/src/main/java/com/delfood/FoodDeliveryApplication.java +++ b/src/main/java/com/delfood/FoodDeliveryApplication.java @@ -5,6 +5,7 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @SpringBootApplication @@ -24,6 +25,7 @@ @EnableAspectJAutoProxy // 최상위 클래스에 적용해야 AOP를 찾을 수 있도록 만들어준다. @EnableCaching // Spring에서 Caching을 사용하겠다고 선언한다. @EnableAsync // 메서드를 비동기 방식으로 실행할 수 있도록 설정한다. +@EnableScheduling // 스케줄링을 허용한다. public class FoodDeliveryApplication { public static void main(String[] args) { diff --git a/src/main/java/com/delfood/dao/FcmDao.java b/src/main/java/com/delfood/dao/FcmDao.java index 3efe483..5c4ccff 100644 --- a/src/main/java/com/delfood/dao/FcmDao.java +++ b/src/main/java/com/delfood/dao/FcmDao.java @@ -22,6 +22,9 @@ public class FcmDao { @Autowired private ObjectMapper objectMapper; + + @Value("#{expire.fcm.rider}") + private static Long riderTokenExpireSecond; @Value("${expire.fcm.member}") private static Long memberTokenExpireSecond; @@ -85,6 +88,35 @@ public void addOwnerToken(String ownerId, String token) { } } + public void addRiderToken(String riderId, String token) { + String key = RedisKeyFactory.generateFcmRiderKey(riderId); + redisTemplate.watch(key); + try { + if (getRiderTokens(riderId).contains(token)) { // 토큰이 이미 있을 경우 + return; + } + redisTemplate.multi(); + + redisTemplate.opsForList().rightPush(key, token); + redisTemplate.expire(key, riderTokenExpireSecond, TimeUnit.SECONDS); + + redisTemplate.exec(); + } catch (Exception e) { + log.error("Redis Add Rider Token ERROR! key : {}", key); + log.error("ERROR Info : {} ", e.getMessage()); + redisTemplate.discard(); + throw new RuntimeException( + "Cannot add rider token. key : " + key + ", ERROR Info " + e.getMessage()); + } + } + + public List getRiderTokens(String riderId) { + return redisTemplate.opsForList().range(RedisKeyFactory.generateFcmRiderKey(riderId), 0, -1) + .stream() + .map(e -> objectMapper.convertValue(e, String.class)) + .collect(Collectors.toList()); + } + /** * 해당 고객의 토큰 리스트를 조회한다. * @author jun diff --git a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java new file mode 100644 index 0000000..4d37c97 --- /dev/null +++ b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java @@ -0,0 +1,23 @@ +package com.delfood.dao.deliveery; + +import com.delfood.dto.address.Position; +import com.delfood.dto.rider.DeliveryRiderDTO; +import java.util.List; + +public interface DeliveryDao { + + void updateRiderInfo(DeliveryRiderDTO riderInfo); + + long deleteRiderInfo(String riderId); + + boolean hasRiderInfo(String riderId); + + void deleteNonUpdatedRiders(); + + DeliveryRiderDTO getRiderInfo(String riderId); + + List toList(); + + long deleteAll(List idList); + +} diff --git a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java new file mode 100644 index 0000000..b519b60 --- /dev/null +++ b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java @@ -0,0 +1,110 @@ +package com.delfood.dao.deliveery; + +import com.delfood.dto.address.Position; +import com.delfood.dto.rider.DeliveryRiderDTO; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; + +@Repository(value = "multiThreadDeliveryDao") +public class MultiThreadDeliveryDao implements DeliveryDao{ + private Map riders; + + @Value("rider.expire") + private static Long expireTime; + + @PostConstruct + public void init() { + this.riders = new ConcurrentHashMap(); + } + + /** + * 내부 Map에 라이더 정보를 갱신한다. + * 만약 Map 내부에 정보가 없다면 새롭게 정보를 추가한다. + * 라이더 정보가 저장되면 라이더는 실시간으로 정보를 업데이트해야한다. + * @param riderInfo 라이더 정보 + */ + @Override + public void updateRiderInfo(DeliveryRiderDTO riderInfo) { + if (riders.containsKey(riderInfo.getId())) { + riders.replace(riderInfo.getId(), riderInfo); + } else { + riders.put(riderInfo.getId(), riderInfo); + } + } + + /** + * 배달 대기를 제거한다. + * @author jun + * @param riderId 제거할 라이더의 아이디 + */ + @Override + public long deleteRiderInfo(String riderId) { + return riders.remove(riderId) == null ? 0 : 1; + } + + /** + * 해당 라이더가 저장소 내에 존재하는지 확인한다. + * @author jun + * @param riderId 라이더 아이디 + * @return + */ + @Override + public boolean hasRiderInfo(String riderId) { + return riders.containsKey(riderId); + } + + /** + * 리스트 형태로 라이더를 조회한다. + * @author jun + * @return + */ + @Override + public List toList() { + return riders.values().stream().collect(Collectors.toList()); + } + + + /** + * 일정 시간동안 자신의 위치를 업데이트 하지 않는 라이더를 제거한다. + * @author jun + */ + @Override + public void deleteNonUpdatedRiders() { + riders.values().stream() + .filter( + e -> ChronoUnit.SECONDS.between(e.getUpdatedAt(), LocalDateTime.now()) > expireTime) + .forEach(e -> riders.remove(e.getId())); + } + + /** + * 라이더의 정보를 조회한다. + * @author jun + */ + @Override + public DeliveryRiderDTO getRiderInfo(String riderId) { + return riders.get(riderId); + } + + /** + * 리스트로 받은 아이디를 기반으로 라이더를 배달 매칭에서 제거한다. + * @param idList 라이더의 아이디들 + * @return 지워진 라이더 개수 + */ + public long deleteAll(List idList) { + long deleteCount = 0; + for (String id : idList) { + deleteCount += deleteRiderInfo(id); + } + return deleteCount; + } + + +} diff --git a/src/main/java/com/delfood/dto/push/PushMessage.java b/src/main/java/com/delfood/dto/push/PushMessage.java index 128766b..d1c8334 100644 --- a/src/main/java/com/delfood/dto/push/PushMessage.java +++ b/src/main/java/com/delfood/dto/push/PushMessage.java @@ -32,7 +32,8 @@ public static enum Type { requiredOrderRequest(new PushMessage("DelFood 주문취소", "매장에서 주문을 취소하였습니다")), deliveryMatch(new PushMessage("DelFood 배달원 매칭", "배달원이 매칭되었습니다")), deliveryStart(new PushMessage("DelFood 배달 시작", "음식 배달이 시작되었습니다")), - deliverySuccess(new PushMessage("DelFood 배달 완료", "배달이 완료되었습니다")); + deliverySuccess(new PushMessage("DelFood 배달 완료", "배달이 완료되었습니다")), + deliveryRequest(new PushMessage("DelFood 배달 요청", "근처 매장에서 배달을 요청했습니다.")); private PushMessage pushMessage; } diff --git a/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java new file mode 100644 index 0000000..09815b8 --- /dev/null +++ b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java @@ -0,0 +1,20 @@ +package com.delfood.dto.rider; + +import java.time.LocalDateTime; +import com.delfood.dto.address.Position; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(of = "id") +public class DeliveryRiderDTO { + private String id; + + private Position position; + + private LocalDateTime updatedAt; + + public DeliveryRiderDTO() { + this.updatedAt = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/delfood/service/PushService.java b/src/main/java/com/delfood/service/PushService.java index 0c169a8..12bd6f7 100644 --- a/src/main/java/com/delfood/service/PushService.java +++ b/src/main/java/com/delfood/service/PushService.java @@ -222,4 +222,35 @@ public void addErrorMemberPush(String memberId, List messages) { public void addErrorOwnerPush(String ownerId, List messages) { fcmDao.addMemberErrorPush(ownerId, messages); } + + /** + * 라이더에게 메세지를 전송한다. + * @author jun + * @param messageInfo 전송할 메세지 + * @param riderId 라이더 아이디 + */ + public void sendMessageToRider(PushMessage messageInfo, String riderId) { + List tokens = fcmDao.getRiderTokens(riderId); + + if (tokens.size() == 0) { + log.debug("해당 라이더의 FCM 토큰이 없습니다. 라이더 아이디 : {}, 메세지 정보 : {}", riderId, messageInfo); + return; + } + + List messages = tokens.stream().map(token -> Message.builder() + .putData("title", messageInfo.getTitle()) + .putData("message", messageInfo.getMessage()) + .putData("time", LocalDateTime.now().toString()) + .setToken(token) + .build()).collect(Collectors.toList()); + + BatchResponse response; + try { + response = FirebaseMessaging.getInstance().sendAll(messages); + log.info("Sent message: " + response); + } catch (FirebaseMessagingException e) { + log.error("cannot send message to rider. error info : {}", e.getMessage()); + addErrorOwnerPush(riderId, messages); + } + } } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java new file mode 100644 index 0000000..5a02065 --- /dev/null +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -0,0 +1,64 @@ +package com.delfood.service.delivery; + +import com.delfood.dao.deliveery.DeliveryDao; +import com.delfood.dto.address.Position; +import com.delfood.dto.push.PushMessage; +import com.delfood.dto.push.PushMessage.Type; +import com.delfood.dto.rider.DeliveryRiderDTO; +import com.delfood.service.PushService; +import lombok.NonNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class DeliveryService { + + private static final long SCHEDULE_DELETE_DELIVERY_RIDER_SECOND = 300000; + + @Autowired + @Qualifier("multiThreadDeliveryDao") + private DeliveryDao deliveryDao; + + @Autowired + private PushService pushService; + + /** + * 라이더의 정보를 업데이트한다. + * 라이더의 정보가 저장되어 있지 않을 시 저장소에 라이더 정보를 추가한다. + * @param riderInfo 추가할 라이더의 정보 + */ + public void updateRider(@NonNull DeliveryRiderDTO riderInfo) { + deliveryDao.updateRiderInfo(riderInfo); + } + + public DeliveryRiderDTO getRider(@NonNull String riderId) { + return deliveryDao.getRiderInfo(riderId); + } + + /** + * 일정 시간마다 한번씩 위치가 업데이트되지 않은 라이더들을 제거한다. + */ + @Scheduled(fixedRate = SCHEDULE_DELETE_DELIVERY_RIDER_SECOND) // 5분에 한번씩 실행시킨다 + public void deleteBySchedule() { + deliveryDao.deleteNonUpdatedRiders(); + } + + + /** + * 거리를 기반으로 근처 라이더들에게 푸시 메세지를 전송한다. + * @param position 조회할 위치의 중심 점 + * @param distance 중심점에서 몇 미터까지 메세지를 보낼지 정한다. + */ + public void deliveryRequestByDistance(Position position, long distance) { + deliveryDao.toList().stream().filter(e -> e.getPosition().distanceMeter(position) < distance) + .sorted((e1, e2) -> { + double distanceE1 = position.distanceMeter(e1.getPosition()); + double distanceE2 = position.distanceMeter(e2.getPosition()); + return distanceE1 - distanceE2 > 0 ? 1 : distanceE1 - distanceE2 < 0 ? -1 : 0; + }).forEach(e -> pushService + .sendMessageToRider(PushMessage.getMessasge(Type.deliveryRequest), e.getId())); + } + +} diff --git a/src/main/java/com/delfood/utils/RedisKeyFactory.java b/src/main/java/com/delfood/utils/RedisKeyFactory.java index cbfa42d..e73170c 100644 --- a/src/main/java/com/delfood/utils/RedisKeyFactory.java +++ b/src/main/java/com/delfood/utils/RedisKeyFactory.java @@ -2,7 +2,7 @@ public class RedisKeyFactory { public enum Key { - CART, FCM_MEMBER, FCM_OWNER, FCM_MEMBER_ERROR, FCM_OWNER_ERROR + CART, FCM_MEMBER, FCM_OWNER, FCM_MEMBER_ERROR, FCM_OWNER_ERROR, FCM_RIDER } // 인스턴스화 방지 @@ -41,4 +41,8 @@ public static String generateFcmMemberErrorKey(String memberId) { public static String generateFcmOwnerErrorKey(String ownerId) { return generateKey(ownerId, Key.FCM_OWNER_ERROR); } + + public static String generateFcmRiderKey(String riderId) { + return generateKey(riderId, Key.FCM_RIDER); + } } From 44d1eb5e392237e9a7fab7bc7069f7c06da79337 Mon Sep 17 00:00:00 2001 From: yyy9942 Date: Wed, 15 Jan 2020 12:33:36 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=EB=B0=B0=EB=8B=AC=20=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java index b519b60..eafe0e9 100644 --- a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java @@ -98,6 +98,7 @@ public DeliveryRiderDTO getRiderInfo(String riderId) { * @param idList 라이더의 아이디들 * @return 지워진 라이더 개수 */ + @Override public long deleteAll(List idList) { long deleteCount = 0; for (String id : idList) { From 6de3866d31a89e2bdbd5bc848b983068f68ba780 Mon Sep 17 00:00:00 2001 From: Jun Date: Thu, 16 Jan 2020 11:12:22 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/delfood/dto/push/PushMessage.java | 23 +++++++------------ .../com/delfood/service/OrderService.java | 2 +- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/delfood/dto/push/PushMessage.java b/src/main/java/com/delfood/dto/push/PushMessage.java index 128766b..0fcc1db 100644 --- a/src/main/java/com/delfood/dto/push/PushMessage.java +++ b/src/main/java/com/delfood/dto/push/PushMessage.java @@ -12,6 +12,14 @@ public class PushMessage { @NonNull private String message; + public static final PushMessage ADD_ORDER_REQUEST = new PushMessage("DelFood 주문", "새로운 주문이 들어왔습니다"); + public static final PushMessage ACCEPT_ORDER_REQUEST = new PushMessage("DelFood 접수", "주문이 접수되었습니다"); + public static final PushMessage REQUIRED_ORDER_REQUEST = new PushMessage("DelFood 주문취소", "매장에서 주문을 취소하였습니다"); + public static final PushMessage DELIVERY_MATCH = new PushMessage("DelFood 배달원 매칭", "배달원이 매칭되었습니다"); + public static final PushMessage DELIVERY_START = new PushMessage("DelFood 배달 시작", "음식 배달이 시작되었습니다"); + public static final PushMessage DELIVERY_SUCCESS = new PushMessage("DelFood 배달 완료", "배달이 완료되었습니다"); + + private LocalDateTime generatedTime; public PushMessage(String title, String message) { @@ -21,20 +29,5 @@ public PushMessage(String title, String message) { } - public static PushMessage getMessasge(Type type) { - return type.pushMessage; - } - - @AllArgsConstructor - public static enum Type { - addOrderRequest(new PushMessage("DelFood 주문", "새로운 주문이 들어왔습니다")), - acceptOrderRequest(new PushMessage("DelFood 접수", "주문이 접수되었습니다")), - requiredOrderRequest(new PushMessage("DelFood 주문취소", "매장에서 주문을 취소하였습니다")), - deliveryMatch(new PushMessage("DelFood 배달원 매칭", "배달원이 매칭되었습니다")), - deliveryStart(new PushMessage("DelFood 배달 시작", "음식 배달이 시작되었습니다")), - deliverySuccess(new PushMessage("DelFood 배달 완료", "배달이 완료되었습니다")); - - private PushMessage pushMessage; - } } diff --git a/src/main/java/com/delfood/service/OrderService.java b/src/main/java/com/delfood/service/OrderService.java index 9d8b9f0..b6184c0 100644 --- a/src/main/java/com/delfood/service/OrderService.java +++ b/src/main/java/com/delfood/service/OrderService.java @@ -92,7 +92,7 @@ public OrderResponse order(String memberId, List items, long shopI } // 사장님에게 알림(푸시) - PushMessage pushMsg = PushMessage.getMessasge(PushMessage.Type.addOrderRequest); + PushMessage pushMsg = PushMessage.ADD_ORDER_REQUEST; String ownerId = shopService.getShop(shopId).getOwnerId(); pushService.sendMessageToOwner(pushMsg, ownerId); // Exception이 발생하지 않는다. From ea62c9a967d00e98ae3a9d37946b317ce59f0579 Mon Sep 17 00:00:00 2001 From: Jun Date: Thu, 16 Jan 2020 16:23:47 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=EB=B0=B0=EB=8B=AC=EC=9B=90=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delfood/controller/RiderController.java | 18 +++++- .../delfood/dao/deliveery/DeliveryDao.java | 6 ++ .../dao/deliveery/MultiThreadDeliveryDao.java | 57 ++++++++++++++++++- .../dto/rider/AcceptDeliveryRequestDTO.java | 35 ++++++++++++ .../java/com/delfood/mapper/OrderMapper.java | 2 + .../com/delfood/service/OrderService.java | 6 ++ .../service/delivery/DeliveryService.java | 38 ++++++++++++- src/main/resources/mybatis/mapper/orders.xml | 6 ++ 8 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index 6164206..735d6c8 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -4,6 +4,7 @@ import com.delfood.aop.LoginCheck.UserType; import com.delfood.aop.RiderLoginCheck; import com.delfood.dto.rider.RiderDTO; +import com.delfood.service.delivery.DeliveryService; import com.delfood.service.rider.RiderInfoService; import com.delfood.utils.SessionUtil; import com.fasterxml.jackson.core.JsonProcessingException; @@ -37,6 +38,9 @@ public class RiderController { @Autowired private ObjectMapper objectMapper; + @Autowired + private DeliveryService deliveryService; + /** * 아이디 중복 체크. * @author jun @@ -129,7 +133,12 @@ public void updateMail(HttpSession session, @RequestBody UpdateMailRequest reque riderInfoService.changeMail(id, request.getPassword(), request.getUpdateMail()); } - + @PostMapping("delivery/accept") + @LoginCheck(type = UserType.RIDER) + public void deliveryAccept(@RequestBody DeliveryAcceptRequest request, HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + deliveryService.acceptDeliveryRequest(riderId, request.getOrderId()); + } // Request @Getter @@ -140,7 +149,12 @@ private static class SignInRequest { @NonNull private String password; } - + + @Getter + private static class DeliveryAcceptRequest { + private Long orderId; + } + @Getter private static class UpdatePasswordRequest { @NonNull diff --git a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java index 4d37c97..4c6d67c 100644 --- a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java @@ -1,5 +1,6 @@ package com.delfood.dao.deliveery; +import com.delfood.dto.OrderDTO.OrderStatus; import com.delfood.dto.address.Position; import com.delfood.dto.rider.DeliveryRiderDTO; import java.util.List; @@ -19,5 +20,10 @@ public interface DeliveryDao { List toList(); long deleteAll(List idList); + + OrderStatus getOrderStatus(Long orderId); + + void setOrderStatus(Long orderId, OrderStatus status); + void deleteOrderStatus(Long orderId); } diff --git a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java index eafe0e9..652e936 100644 --- a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java @@ -1,28 +1,42 @@ package com.delfood.dao.deliveery; +import com.delfood.dto.OrderDTO.OrderStatus; import com.delfood.dto.address.Position; import com.delfood.dto.rider.DeliveryRiderDTO; +import com.delfood.service.OrderService; + import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import javax.annotation.PostConstruct; +import javax.annotation.concurrent.ThreadSafe; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @Repository(value = "multiThreadDeliveryDao") +@ThreadSafe public class MultiThreadDeliveryDao implements DeliveryDao{ private Map riders; + private Map orders; @Value("rider.expire") private static Long expireTime; + @Autowired + private OrderService orderService; + @PostConstruct public void init() { this.riders = new ConcurrentHashMap(); + this.orders = new ConcurrentHashMap(); } /** @@ -107,5 +121,46 @@ public long deleteAll(List idList) { return deleteCount; } - + /** + * 주문의 상태를 조회한다. + * 주문 정보가 내부 메모리에 없다면 DB에서 조회한 후 메모리에 저장한다. + * @author jun + * @param orderId 조회할 주문 아이디 + */ + @Override + public OrderStatus getOrderStatus(Long orderId) { + OrderStatus status = orders.get(orderId); + if (Objects.isNull(status)) { + status = orderService.getOrderStatus(orderId); + setOrderStatus(orderId, status); + return status; + } + + return status; + } + + /** + * 주문 정보를 내부에 저장한다. + * @author jun + * @param orderId 저장할 주문 아이디 + * @param status 주문의 상태 + */ + @Override + public void setOrderStatus(Long orderId, OrderStatus status) { + if (orders.containsKey(orderId)) { + orders.replace(orderId, status); + } else { + orders.put(orderId, status); + } + } + + /** + * 주문 정보를 삭제한다. + * @param orderId 삭제할 주문 정보 아이디 + * @author jun + */ + @Override + public void deleteOrderStatus(Long orderId) { + orders.remove(orderId); + } } diff --git a/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java b/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java new file mode 100644 index 0000000..b516dc1 --- /dev/null +++ b/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java @@ -0,0 +1,35 @@ +package com.delfood.dto.rider; + +import java.time.LocalDateTime; + +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; + +@Getter +@Builder +public class AcceptDeliveryRequestDTO { + + @NonNull + private Long orderId; + + @NonNull + private String riderId; + + @NonNull + private RequestResult result; + + private LocalDateTime startedAt; + + + @Builder + public AcceptDeliveryRequestDTO(Long orderId, String riderId) { + this.orderId = orderId; + this.riderId = riderId; + startedAt = LocalDateTime.now(); + } + + public static enum RequestResult { + SUCCESS, FAIL + } +} diff --git a/src/main/java/com/delfood/mapper/OrderMapper.java b/src/main/java/com/delfood/mapper/OrderMapper.java index 61721a9..efa21c0 100644 --- a/src/main/java/com/delfood/mapper/OrderMapper.java +++ b/src/main/java/com/delfood/mapper/OrderMapper.java @@ -41,4 +41,6 @@ public interface OrderMapper { void updateOrderStatusAndExArrivalTime(Long orderId, LocalDateTime exArrivalTime); String findMemberIdByOrderId(Long orderId); + + OrderStatus getOrderStatus(Long orderId); } diff --git a/src/main/java/com/delfood/service/OrderService.java b/src/main/java/com/delfood/service/OrderService.java index b6184c0..61fdeff 100644 --- a/src/main/java/com/delfood/service/OrderService.java +++ b/src/main/java/com/delfood/service/OrderService.java @@ -4,6 +4,7 @@ import com.delfood.dto.AddressDTO; import com.delfood.dto.ItemsBillDTO; import com.delfood.dto.ItemsBillDTO.ShopInfo; +import com.delfood.dto.OrderDTO.OrderStatus; import com.delfood.dto.MemberDTO; import com.delfood.dto.OrderBillDTO; import com.delfood.dto.OrderDTO; @@ -293,4 +294,9 @@ public void orderApprove(Long orderId, long minute) { pushService.sendMessageToMember(messageInfo, memberId); } + @Transactional(readOnly = true) + public OrderStatus getOrderStatus(Long orderId) { + return orderMapper.getOrderStatus(orderId); + } + } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index fd8d23d..5fcbd9f 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -1,15 +1,19 @@ package com.delfood.service.delivery; import com.delfood.dao.deliveery.DeliveryDao; +import com.delfood.dto.OrderDTO.OrderStatus; import com.delfood.dto.address.Position; import com.delfood.dto.push.PushMessage; +import com.delfood.dto.rider.AcceptDeliveryRequestDTO; import com.delfood.dto.rider.DeliveryRiderDTO; +import com.delfood.service.OrderService; import com.delfood.service.PushService; import lombok.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class DeliveryService { @@ -23,6 +27,9 @@ public class DeliveryService { @Autowired private PushService pushService; + @Autowired + private OrderService orderService; + /** * 라이더의 정보를 업데이트한다. * 라이더의 정보가 저장되어 있지 않을 시 저장소에 라이더 정보를 추가한다. @@ -59,5 +66,34 @@ public void deliveryRequestByDistance(Position position, long distance) { }).forEach(e -> pushService .sendMessageToRider(PushMessage.DELIVERY_REQUEST, e.getId())); } - + + /** + * 배달원을 매칭한다. + * @author jun + * @param riderId + * @param orderId + * @return + */ + @Transactional + public AcceptDeliveryRequestDTO acceptDeliveryRequest(String riderId, Long orderId) { + OrderStatus status = deliveryDao.getOrderStatus(orderId); + AcceptDeliveryRequestDTO result; + if (OrderStatus.ORDER_REQUEST.equals(status)) { + deliveryDao.setOrderStatus(orderId, OrderStatus.IN_DELIVERY); + orderService.updateStatus(orderId, OrderStatus.IN_DELIVERY); + result = AcceptDeliveryRequestDTO.builder() + .orderId(orderId) + .riderId(riderId) + .result(AcceptDeliveryRequestDTO.RequestResult.SUCCESS) + .build(); + } else { + result = AcceptDeliveryRequestDTO.builder() + .orderId(orderId) + .riderId(riderId) + .result(AcceptDeliveryRequestDTO.RequestResult.FAIL) + .build(); + } + + return result; + } } diff --git a/src/main/resources/mybatis/mapper/orders.xml b/src/main/resources/mybatis/mapper/orders.xml index 216b253..cb613c9 100644 --- a/src/main/resources/mybatis/mapper/orders.xml +++ b/src/main/resources/mybatis/mapper/orders.xml @@ -370,4 +370,10 @@ WHERE odr.id = #{orderId} + + From c0ee25aa4db7b281477cda9d1ad84414ca65f6e0 Mon Sep 17 00:00:00 2001 From: Jun Date: Fri, 17 Jan 2020 19:30:50 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delfood/dao/deliveery/DeliveryDao.java | 6 +-- ...ryDao.java => LocalMemoryDeliveryDao.java} | 46 ++++++++----------- .../com/delfood/service/OrderService.java | 1 - .../service/delivery/DeliveryService.java | 11 ++--- 4 files changed, 26 insertions(+), 38 deletions(-) rename src/main/java/com/delfood/dao/deliveery/{MultiThreadDeliveryDao.java => LocalMemoryDeliveryDao.java} (75%) diff --git a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java index 4c6d67c..5365a38 100644 --- a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java @@ -9,7 +9,7 @@ public interface DeliveryDao { void updateRiderInfo(DeliveryRiderDTO riderInfo); - long deleteRiderInfo(String riderId); + boolean deleteRiderInfo(String riderId); boolean hasRiderInfo(String riderId); @@ -17,9 +17,9 @@ public interface DeliveryDao { DeliveryRiderDTO getRiderInfo(String riderId); - List toList(); + List getRiderList(); - long deleteAll(List idList); + void deleteAll(List idList); OrderStatus getOrderStatus(Long orderId); diff --git a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java similarity index 75% rename from src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java rename to src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java index 652e936..cfee4a1 100644 --- a/src/main/java/com/delfood/dao/deliveery/MultiThreadDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java @@ -21,11 +21,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; -@Repository(value = "multiThreadDeliveryDao") +@Repository("multiThreadDeliveryDao") @ThreadSafe -public class MultiThreadDeliveryDao implements DeliveryDao{ - private Map riders; - private Map orders; +public class LocalMemoryDeliveryDao implements DeliveryDao{ + private ConcurrentHashMap riders; + private ConcurrentHashMap orders; @Value("rider.expire") private static Long expireTime; @@ -47,11 +47,7 @@ public void init() { */ @Override public void updateRiderInfo(DeliveryRiderDTO riderInfo) { - if (riders.containsKey(riderInfo.getId())) { - riders.replace(riderInfo.getId(), riderInfo); - } else { - riders.put(riderInfo.getId(), riderInfo); - } + riders.put(riderInfo.getId(), riderInfo); } /** @@ -60,8 +56,8 @@ public void updateRiderInfo(DeliveryRiderDTO riderInfo) { * @param riderId 제거할 라이더의 아이디 */ @Override - public long deleteRiderInfo(String riderId) { - return riders.remove(riderId) == null ? 0 : 1; + public boolean deleteRiderInfo(String riderId) { + return riders.remove(riderId) != null; } /** @@ -81,7 +77,7 @@ public boolean hasRiderInfo(String riderId) { * @return */ @Override - public List toList() { + public List getRiderList() { return riders.values().stream().collect(Collectors.toList()); } @@ -110,15 +106,12 @@ public DeliveryRiderDTO getRiderInfo(String riderId) { /** * 리스트로 받은 아이디를 기반으로 라이더를 배달 매칭에서 제거한다. * @param idList 라이더의 아이디들 - * @return 지워진 라이더 개수 */ @Override - public long deleteAll(List idList) { - long deleteCount = 0; + public void deleteAll(List idList) { for (String id : idList) { - deleteCount += deleteRiderInfo(id); + deleteRiderInfo(id); } - return deleteCount; } /** @@ -129,14 +122,15 @@ public long deleteAll(List idList) { */ @Override public OrderStatus getOrderStatus(Long orderId) { - OrderStatus status = orders.get(orderId); - if (Objects.isNull(status)) { - status = orderService.getOrderStatus(orderId); - setOrderStatus(orderId, status); + synchronized (orders) { + OrderStatus status = orders.get(orderId); + if (Objects.isNull(status)) { + status = orderService.getOrderStatus(orderId); + setOrderStatus(orderId, status); + return status; + } return status; } - - return status; } /** @@ -147,11 +141,7 @@ public OrderStatus getOrderStatus(Long orderId) { */ @Override public void setOrderStatus(Long orderId, OrderStatus status) { - if (orders.containsKey(orderId)) { - orders.replace(orderId, status); - } else { - orders.put(orderId, status); - } + orders.put(orderId, status); } /** diff --git a/src/main/java/com/delfood/service/OrderService.java b/src/main/java/com/delfood/service/OrderService.java index 61fdeff..21d8994 100644 --- a/src/main/java/com/delfood/service/OrderService.java +++ b/src/main/java/com/delfood/service/OrderService.java @@ -294,7 +294,6 @@ public void orderApprove(Long orderId, long minute) { pushService.sendMessageToMember(messageInfo, memberId); } - @Transactional(readOnly = true) public OrderStatus getOrderStatus(Long orderId) { return orderMapper.getOrderStatus(orderId); } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index 5fcbd9f..25daf20 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -58,20 +58,19 @@ public void deleteBySchedule() { * @param distance 중심점에서 몇 미터까지 메세지를 보낼지 정한다. */ public void deliveryRequestByDistance(Position position, long distance) { - deliveryDao.toList().stream().filter(e -> e.getPosition().distanceMeter(position) < distance) - .sorted((e1, e2) -> { + deliveryDao.getRiderList().stream() + .filter(e -> e.getPosition().distanceMeter(position) < distance).sorted((e1, e2) -> { double distanceE1 = position.distanceMeter(e1.getPosition()); double distanceE2 = position.distanceMeter(e2.getPosition()); return distanceE1 - distanceE2 > 0 ? 1 : distanceE1 - distanceE2 < 0 ? -1 : 0; - }).forEach(e -> pushService - .sendMessageToRider(PushMessage.DELIVERY_REQUEST, e.getId())); + }).forEach(e -> pushService.sendMessageToRider(PushMessage.DELIVERY_REQUEST, e.getId())); } /** * 배달원을 매칭한다. * @author jun - * @param riderId - * @param orderId + * @param riderId 라이더 아이디 + * @param orderId 주문 아이디 * @return */ @Transactional From 82f0018e7b981baa8b0199832bce194f7678feb0 Mon Sep 17 00:00:00 2001 From: yyy99 Date: Fri, 17 Jan 2020 22:46:49 +0900 Subject: [PATCH 06/13] =?UTF-8?q?maven=EC=97=90=EC=84=9C=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java b/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java index b516dc1..2ac0b09 100644 --- a/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java +++ b/src/main/java/com/delfood/dto/rider/AcceptDeliveryRequestDTO.java @@ -4,10 +4,10 @@ import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.NonNull; @Getter -@Builder public class AcceptDeliveryRequestDTO { @NonNull @@ -23,9 +23,10 @@ public class AcceptDeliveryRequestDTO { @Builder - public AcceptDeliveryRequestDTO(Long orderId, String riderId) { + public AcceptDeliveryRequestDTO(Long orderId, String riderId, RequestResult result) { this.orderId = orderId; this.riderId = riderId; + this.result = result; startedAt = LocalDateTime.now(); } From 0fa19180b2934e4ed8dbee3d862fb43c03ac2f6a Mon Sep 17 00:00:00 2001 From: Jun Date: Mon, 20 Jan 2020 15:29:27 +0900 Subject: [PATCH 07/13] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/deliveery/LocalMemoryDeliveryDao.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java index cfee4a1..2358a55 100644 --- a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java @@ -122,15 +122,11 @@ public void deleteAll(List idList) { */ @Override public OrderStatus getOrderStatus(Long orderId) { - synchronized (orders) { - OrderStatus status = orders.get(orderId); - if (Objects.isNull(status)) { - status = orderService.getOrderStatus(orderId); - setOrderStatus(orderId, status); - return status; - } + return orders.computeIfAbsent(orderId, key -> { + OrderStatus status = orderService.getOrderStatus(orderId); + setOrderStatus(orderId, status); return status; - } + }); } /** From 41da68f9136b17b9167339ae15a02f349da750eb Mon Sep 17 00:00:00 2001 From: Jun Date: Mon, 20 Jan 2020 19:42:06 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=EB=B0=B0=EB=8B=AC=EC=9B=90=EC=9D=98=20?= =?UTF-8?q?=EB=B0=B0=EB=8B=AC=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=EB=B0=B0=EB=8B=AC=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0=EB=AA=85=EB=8B=A8=EC=97=90=20=EC=98=AC=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=20-=20=EB=B0=B0=EB=8B=AC=20=EB=8C=80=EA=B8=B0?= =?UTF-8?q?=EB=AA=85=EB=8B=A8=20=EC=82=AD=EC=A0=9C=20-=20=EB=82=B4=20?= =?UTF-8?q?=EB=B0=B0=EB=8B=AC=20=ED=98=84=ED=99=A9=20-=20=EB=82=B4?= =?UTF-8?q?=EA=B0=80=20=EB=B0=B0=EB=8B=AC=ED=95=9C=20=EB=AC=BC=ED=92=88?= =?UTF-8?q?=EB=93=A4=20(=ED=8E=98=EC=9D=B4=EC=A7=95=20=ED=8F=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delfood/controller/RiderController.java | 111 +++++++++++++++++- .../java/com/delfood/dto/SimpleShopInfo.java | 19 +++ .../delfood/dto/rider/DeliveryInfoDTO.java | 41 +++++++ .../delfood/dto/rider/DeliveryOrderInfo.java | 10 ++ .../com/delfood/mapper/DeliveryMapper.java | 13 ++ .../java/com/delfood/mapper/OrderMapper.java | 4 + .../com/delfood/mapper/RiderInfoMapper.java | 4 + .../com/delfood/service/OrderService.java | 16 +++ .../service/delivery/DeliveryService.java | 53 ++++++++- .../service/rider/RiderInfoService.java | 4 + .../resources/mybatis/mapper/delivery.xml | 76 ++++++++++++ src/main/resources/mybatis/mapper/orders.xml | 14 +++ src/main/resources/mybatis/mapper/rider.xml | 14 +++ 13 files changed, 375 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/delfood/dto/SimpleShopInfo.java create mode 100644 src/main/java/com/delfood/dto/rider/DeliveryInfoDTO.java create mode 100644 src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java create mode 100644 src/main/java/com/delfood/mapper/DeliveryMapper.java create mode 100644 src/main/resources/mybatis/mapper/delivery.xml diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index 735d6c8..935588c 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -3,12 +3,20 @@ import com.delfood.aop.LoginCheck; import com.delfood.aop.LoginCheck.UserType; import com.delfood.aop.RiderLoginCheck; +import com.delfood.dto.rider.AcceptDeliveryRequestDTO; +import com.delfood.dto.rider.DeliveryRiderDTO; +import com.delfood.dto.rider.AcceptDeliveryRequestDTO.RequestResult; +import com.delfood.dto.rider.DeliveryInfoDTO; import com.delfood.dto.rider.RiderDTO; +import com.delfood.error.exception.DuplicateException; +import com.delfood.error.exception.TargetNotFoundException; +import com.delfood.service.OrderService; import com.delfood.service.delivery.DeliveryService; import com.delfood.service.rider.RiderInfoService; import com.delfood.utils.SessionUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; import java.util.Objects; import javax.servlet.http.HttpSession; import lombok.Getter; @@ -22,6 +30,7 @@ import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; @@ -41,6 +50,9 @@ public class RiderController { @Autowired private DeliveryService deliveryService; + @Autowired + private OrderService orderService; + /** * 아이디 중복 체크. * @author jun @@ -127,19 +139,109 @@ public void deleteRiderAccount(HttpSession session, String password) { SessionUtil.logoutRider(session); } + /** + * 라이더의 메일 주소를 변경한다. + * @param session 현제 세션 + * @param request 요청 정보 + */ @PatchMapping("mail") public void updateMail(HttpSession session, @RequestBody UpdateMailRequest request) { String id = SessionUtil.getLoginRiderId(session); riderInfoService.changeMail(id, request.getPassword(), request.getUpdateMail()); } + /** + * 주문에 대한 배달 매칭 요청을 진행한다. + * @param request 요청 정보 + * @param session 현재 세션 + * @return + */ @PostMapping("delivery/accept") @LoginCheck(type = UserType.RIDER) - public void deliveryAccept(@RequestBody DeliveryAcceptRequest request, HttpSession session) { + public AcceptDeliveryRequestDTO deliveryAccept(@RequestBody DeliveryAcceptRequest request, + HttpSession session) { String riderId = SessionUtil.getLoginRiderId(session); - deliveryService.acceptDeliveryRequest(riderId, request.getOrderId()); + return deliveryService.acceptDeliveryRequest(riderId, request.getOrderId()); } + /** + * 해당 주문의 배달을 완료했다는 요청을 받는다. + * @author jun + * @param request 요청 정보 + * @param session 현제 세션 + */ + @PatchMapping("delivery/complete") + @LoginCheck(type = UserType.RIDER) + public void deliveryComplete(@RequestBody DeliveryCompleteRequest request, HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + if (deliveryService.isRiderOrder(riderId, request.getOrderId()) == false) { + log.info("주문 완료 권한 없음. 주문 아이디 : {}, 라이더 아이디 : {}", request.getOrderId(), riderId); + throw new IllegalArgumentException("해당 라이더가 배달중인 주문이 아닙니다. 권한이 없습니다."); + } + deliveryService.deliveryComplete(request.getOrderId()); + } + + /** + * 라이더의 현제 위치 정보를 업데이트한다. + * 새로운 정보를 덧씌우는 것이기 때문에 put으로 매핑하였다. + * @author jun + * @param info 요청 정보 + * @param session 현재 세션 + */ + @PutMapping("delivery/available") + @LoginCheck(type = UserType.RIDER) + public void updateDeliveryRiderInfo(DeliveryRiderDTO info, HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + + if (riderInfoService.hasDelivery(riderId)) { + throw new DuplicateException("이미 진행중인 배달이 있습니다. 한번에 하나의 배달만 가능합니다."); + } + + deliveryService.updateRider(info); + } + + /** + * 라이더를 배당 매칭 대기 명단에서 제거한다. + * @author jun + * @param session 현재 세션 + */ + @DeleteMapping("delivery/available") + @LoginCheck(type = UserType.RIDER) + public void deletDeliveryRiderInfo(HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + deliveryService.delete(riderId); + } + + /** + * 라이더의 모든 배달 현황을 확인한다. + * @param session 현제 세션 + * @return + */ + @GetMapping("delivery/{orderId}") + @LoginCheck(type = UserType.RIDER) + public List getAllDeliveryList( + @PathVariable(name = "orderId", required = false, value = "0") Long lastViewedOrderId, + HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + return deliveryService.getMyAllDeliveries(riderId, lastViewedOrderId); + } + + /** + * 현재 배달중인 주문 정보를 확인한다. + * @param session 현제 세션 + * @return + */ + @GetMapping("delivery") + @LoginCheck(type = UserType.RIDER) + public DeliveryInfoDTO getCurrentDelivery(HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + DeliveryInfoDTO currentDelivery = deliveryService.getCurrentDelivery(riderId); + if (Objects.isNull(currentDelivery)) { + throw new TargetNotFoundException("현재 라이더님은 배달중이 아닙니다."); + } + return currentDelivery; + } + // Request @Getter private static class SignInRequest { @@ -173,6 +275,11 @@ private static class UpdateMailRequest { private String updateMail; } + @Getter + private static class DeliveryCompleteRequest { + @NonNull + private Long orderId; + } } diff --git a/src/main/java/com/delfood/dto/SimpleShopInfo.java b/src/main/java/com/delfood/dto/SimpleShopInfo.java new file mode 100644 index 0000000..5fce921 --- /dev/null +++ b/src/main/java/com/delfood/dto/SimpleShopInfo.java @@ -0,0 +1,19 @@ +package com.delfood.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Getter +@NoArgsConstructor +public class SimpleShopInfo { + private String id; + private String name; + + @Builder + public SimpleShopInfo(@NonNull String id, @NonNull String name) { + this.id = id; + this.name = name; + } +} diff --git a/src/main/java/com/delfood/dto/rider/DeliveryInfoDTO.java b/src/main/java/com/delfood/dto/rider/DeliveryInfoDTO.java new file mode 100644 index 0000000..dacb572 --- /dev/null +++ b/src/main/java/com/delfood/dto/rider/DeliveryInfoDTO.java @@ -0,0 +1,41 @@ +package com.delfood.dto.rider; + +import com.delfood.dto.OrderBillDTO.SimpleAddressInfo; +import com.delfood.dto.SimpleShopInfo; +import java.time.LocalDateTime; +import javax.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Getter +@NoArgsConstructor +public class DeliveryInfoDTO { + @NonNull + private String riderId; + + @NonNull + private SimpleAddressInfo addressInfo; + + @NonNull + private SimpleShopInfo shopInfo; + + @NonNull + private DeliveryOrderInfo orderInfo; + + @Nullable + private LocalDateTime arrivalTime; + + + @Builder + public DeliveryInfoDTO(@NonNull String riderId, @NonNull SimpleAddressInfo addressInfo, + @NonNull SimpleShopInfo shopInfo, LocalDateTime arrivalTime, + @NonNull DeliveryOrderInfo orderInfo) { + this.riderId = riderId; + this.addressInfo = addressInfo; + this.shopInfo = shopInfo; + this.arrivalTime = arrivalTime; + this.orderInfo = orderInfo; + } +} diff --git a/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java b/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java new file mode 100644 index 0000000..e26234a --- /dev/null +++ b/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java @@ -0,0 +1,10 @@ +package com.delfood.dto.rider; + +import com.delfood.dto.OrderDTO.OrderStatus; + +public class DeliveryOrderInfo { + private Long orderId; + private Long deliveryCost; + private OrderStatus orderStatus; + +} diff --git a/src/main/java/com/delfood/mapper/DeliveryMapper.java b/src/main/java/com/delfood/mapper/DeliveryMapper.java new file mode 100644 index 0000000..c44f249 --- /dev/null +++ b/src/main/java/com/delfood/mapper/DeliveryMapper.java @@ -0,0 +1,13 @@ +package com.delfood.mapper; + +import java.util.List; +import org.springframework.stereotype.Repository; +import com.delfood.dto.rider.DeliveryInfoDTO; + +@Repository +public interface DeliveryMapper { + + List findByRiderId(String riderId, Long lastViewedOrderId); + + DeliveryInfoDTO findCurrentDeliveryByRiderId(String riderId); +} diff --git a/src/main/java/com/delfood/mapper/OrderMapper.java b/src/main/java/com/delfood/mapper/OrderMapper.java index efa21c0..177ea32 100644 --- a/src/main/java/com/delfood/mapper/OrderMapper.java +++ b/src/main/java/com/delfood/mapper/OrderMapper.java @@ -43,4 +43,8 @@ public interface OrderMapper { String findMemberIdByOrderId(Long orderId); OrderStatus getOrderStatus(Long orderId); + + void updateRider(Long orderId, String riderId); + + void updateStatusAndArrivalTime(@NonNull Long orderId, LocalDateTime completeTime); } diff --git a/src/main/java/com/delfood/mapper/RiderInfoMapper.java b/src/main/java/com/delfood/mapper/RiderInfoMapper.java index 8df7aea..1f709e9 100644 --- a/src/main/java/com/delfood/mapper/RiderInfoMapper.java +++ b/src/main/java/com/delfood/mapper/RiderInfoMapper.java @@ -21,4 +21,8 @@ public boolean isExistAndEffectiveByIdAndPassword(@NonNull String id, @NonNull String password); public long updateMail(@NonNull String id, @NonNull String mail); + + public boolean isRiderOrder(@NonNull String riderId, @NonNull Long orderId); + + public boolean hasDelivery(String riderId); } diff --git a/src/main/java/com/delfood/service/OrderService.java b/src/main/java/com/delfood/service/OrderService.java index 21d8994..dd3d7d1 100644 --- a/src/main/java/com/delfood/service/OrderService.java +++ b/src/main/java/com/delfood/service/OrderService.java @@ -298,4 +298,20 @@ public OrderStatus getOrderStatus(Long orderId) { return orderMapper.getOrderStatus(orderId); } + /** + * 해당 주문에 라이더를 배치한다. + * @param orderId 주문번호 + * @param riderId 라이더 아이디 + */ + public void setRider(Long orderId, String riderId) { + log.info("주문번호 '{}'번에 라이더 '{}'가 매칭되었습니다.", orderId, riderId); + orderMapper.updateRider(orderId, riderId); + } + + public void completeOrder(@NonNull Long orderId, LocalDateTime completeTime) { + log.info("주문번호 '{}'번 완료되었습니다.", orderId); + orderMapper.updateStatusAndArrivalTime(orderId, completeTime); + } + + } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index 25daf20..8f24685 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -5,10 +5,16 @@ import com.delfood.dto.address.Position; import com.delfood.dto.push.PushMessage; import com.delfood.dto.rider.AcceptDeliveryRequestDTO; +import com.delfood.dto.rider.DeliveryInfoDTO; import com.delfood.dto.rider.DeliveryRiderDTO; +import com.delfood.mapper.DeliveryMapper; +import com.delfood.mapper.RiderInfoMapper; import com.delfood.service.OrderService; import com.delfood.service.PushService; import lombok.NonNull; +import java.time.LocalDateTime; +import java.util.List; +import javax.annotation.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; @@ -30,6 +36,12 @@ public class DeliveryService { @Autowired private OrderService orderService; + @Autowired + private RiderInfoMapper riderInfoMapper; + + @Autowired + private DeliveryMapper deliveryMapper; + /** * 라이더의 정보를 업데이트한다. * 라이더의 정보가 저장되어 있지 않을 시 저장소에 라이더 정보를 추가한다. @@ -74,12 +86,13 @@ public void deliveryRequestByDistance(Position position, long distance) { * @return */ @Transactional - public AcceptDeliveryRequestDTO acceptDeliveryRequest(String riderId, Long orderId) { + public AcceptDeliveryRequestDTO acceptDeliveryRequest(@NonNull String riderId, + @NonNull Long orderId) { OrderStatus status = deliveryDao.getOrderStatus(orderId); AcceptDeliveryRequestDTO result; if (OrderStatus.ORDER_REQUEST.equals(status)) { deliveryDao.setOrderStatus(orderId, OrderStatus.IN_DELIVERY); - orderService.updateStatus(orderId, OrderStatus.IN_DELIVERY); + orderService.setRider(orderId, riderId); result = AcceptDeliveryRequestDTO.builder() .orderId(orderId) .riderId(riderId) @@ -95,4 +108,40 @@ public AcceptDeliveryRequestDTO acceptDeliveryRequest(String riderId, Long order return result; } + + /** + * 배달을 완료한다. + * 현재 서버시간을 기준으로 배달 완료 시간이 기록된다. + * 주문의 상태를 '배달 완료'로 변경시킨다. + * @author jun + * @param orderId 주문번호 + */ + public void deliveryComplete(@NonNull Long orderId) { + LocalDateTime completeTime = LocalDateTime.now(); + orderService.completeOrder(orderId, completeTime); + } + + /** + * 해당 라이더가 주문을 맡았는지 조회한다. + * @param riderId 라이더 아이디 + * @param orderId 주문번호 + * @return + */ + public boolean isRiderOrder(@NonNull String riderId, @NonNull Long orderId) { + return riderInfoMapper.isRiderOrder(riderId, orderId); + } + + public void delete(String riderId) { + deliveryDao.deleteRiderInfo(riderId); + } + + public List getMyAllDeliveries(String riderId, + @Nullable Long lastViewedOrderId) { + return deliveryMapper.findByRiderId(riderId, lastViewedOrderId); + } + + public DeliveryInfoDTO getCurrentDelivery(String riderId) { + return deliveryMapper.findCurrentDeliveryByRiderId(riderId); + } + } diff --git a/src/main/java/com/delfood/service/rider/RiderInfoService.java b/src/main/java/com/delfood/service/rider/RiderInfoService.java index 7478520..f96ed8b 100644 --- a/src/main/java/com/delfood/service/rider/RiderInfoService.java +++ b/src/main/java/com/delfood/service/rider/RiderInfoService.java @@ -144,4 +144,8 @@ public void changeMail(@NonNull String id, @NonNull String password, @NonNull St riderInfoMapper.updateMail(id, mail); } + + public boolean hasDelivery(String riderId) { + return riderInfoMapper.hasDelivery(riderId); + } } diff --git a/src/main/resources/mybatis/mapper/delivery.xml b/src/main/resources/mybatis/mapper/delivery.xml new file mode 100644 index 0000000..49e9b7a --- /dev/null +++ b/src/main/resources/mybatis/mapper/delivery.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mybatis/mapper/orders.xml b/src/main/resources/mybatis/mapper/orders.xml index cb613c9..b04a8c6 100644 --- a/src/main/resources/mybatis/mapper/orders.xml +++ b/src/main/resources/mybatis/mapper/orders.xml @@ -376,4 +376,18 @@ WHERE odr.id = #{orderId} + + UPDATE ORDERS + SET rider_id = #{riderId}. + order_status = 'IN_DELIVERY' + WHERE id = #{orderId} + + + + UPDATE ORDERS + SET order_status = 'DELIVERY_COMPLETE', + arrival_time = #{completeTime} + WHERE id = #{orderId} + + diff --git a/src/main/resources/mybatis/mapper/rider.xml b/src/main/resources/mybatis/mapper/rider.xml index 7b54cf9..692a649 100644 --- a/src/main/resources/mybatis/mapper/rider.xml +++ b/src/main/resources/mybatis/mapper/rider.xml @@ -47,4 +47,18 @@ updated_at = NOW() WHERE id = #{id} + + + + \ No newline at end of file From 6224def1eb6c2200d7a56d9e2ae84302e4cfd59f Mon Sep 17 00:00:00 2001 From: Jun Date: Tue, 21 Jan 2020 11:04:09 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/delfood/controller/RiderController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index 935588c..8271eb0 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -1,6 +1,7 @@ package com.delfood.controller; import com.delfood.aop.LoginCheck; +import com.delfood.aop.OwnerShopCheck; import com.delfood.aop.LoginCheck.UserType; import com.delfood.aop.RiderLoginCheck; import com.delfood.dto.rider.AcceptDeliveryRequestDTO; @@ -217,11 +218,9 @@ public void deletDeliveryRiderInfo(HttpSession session) { * @param session 현제 세션 * @return */ - @GetMapping("delivery/{orderId}") + @GetMapping("delivery") @LoginCheck(type = UserType.RIDER) - public List getAllDeliveryList( - @PathVariable(name = "orderId", required = false, value = "0") Long lastViewedOrderId, - HttpSession session) { + public List getAllDeliveryList(Long lastViewedOrderId, HttpSession session) { String riderId = SessionUtil.getLoginRiderId(session); return deliveryService.getMyAllDeliveries(riderId, lastViewedOrderId); } @@ -231,7 +230,7 @@ public List getAllDeliveryList( * @param session 현제 세션 * @return */ - @GetMapping("delivery") + @GetMapping("delivery/current") @LoginCheck(type = UserType.RIDER) public DeliveryInfoDTO getCurrentDelivery(HttpSession session) { String riderId = SessionUtil.getLoginRiderId(session); From c945f37066a872a85aa3a5a648c7f4c9000d0f0f Mon Sep 17 00:00:00 2001 From: yyy99 Date: Tue, 21 Jan 2020 18:05:26 +0900 Subject: [PATCH 10/13] =?UTF-8?q?=EC=98=A4=EB=8A=98=EC=9D=98=20=EB=B0=B0?= =?UTF-8?q?=EB=8B=AC=20=EC=88=98=EC=9E=85=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delfood/controller/RiderController.java | 38 +++++++++++++++++++ .../delfood/dto/rider/DeliveryOrderInfo.java | 2 + .../com/delfood/mapper/DeliveryMapper.java | 4 ++ .../service/delivery/DeliveryService.java | 7 ++++ .../resources/mybatis/mapper/delivery.xml | 7 ++++ 5 files changed, 58 insertions(+) diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index 8271eb0..fdc2dbf 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -8,6 +8,7 @@ import com.delfood.dto.rider.DeliveryRiderDTO; import com.delfood.dto.rider.AcceptDeliveryRequestDTO.RequestResult; import com.delfood.dto.rider.DeliveryInfoDTO; +import com.delfood.dto.rider.DeliveryOrderInfo; import com.delfood.dto.rider.RiderDTO; import com.delfood.error.exception.DuplicateException; import com.delfood.error.exception.TargetNotFoundException; @@ -17,9 +18,11 @@ import com.delfood.utils.SessionUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import javax.servlet.http.HttpSession; +import lombok.Builder; import lombok.Getter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -241,6 +244,22 @@ public DeliveryInfoDTO getCurrentDelivery(HttpSession session) { return currentDelivery; } + /** + * 오늘 배달한 배달료를 조회한다. + * @param session 현제 세션 + * @return + */ + @GetMapping("delivery/bills/today") + @LoginCheck(type = UserType.RIDER) + public TodayDeliveryBillsResponse getTodayDeliveyBills(HttpSession session) { + String riderId = SessionUtil.getLoginRiderId(session); + List todayDeliveryBills = deliveryService.getTodayDeliveryBills(riderId); + return TodayDeliveryBillsResponse.builder() + .deliveries(todayDeliveryBills) + .riderId(riderId) + .build(); + } + // Request @Getter private static class SignInRequest { @@ -280,5 +299,24 @@ private static class DeliveryCompleteRequest { private Long orderId; } + @Getter + private static class TodayDeliveryBillsResponse { + private List deliveries; + private long totalCost; + private String riderId; + + @Builder + public TodayDeliveryBillsResponse(@NonNull List deliveries, + @NonNull String riderId) { + this.deliveries = deliveries; + this.riderId = riderId; + initCost(); + } + + private void initCost() { + this.totalCost = deliveries.stream().mapToLong(e -> e.getDeliveryCost()).sum(); + } + } + } diff --git a/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java b/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java index e26234a..e03b9a1 100644 --- a/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java +++ b/src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java @@ -1,7 +1,9 @@ package com.delfood.dto.rider; import com.delfood.dto.OrderDTO.OrderStatus; +import lombok.Getter; +@Getter public class DeliveryOrderInfo { private Long orderId; private Long deliveryCost; diff --git a/src/main/java/com/delfood/mapper/DeliveryMapper.java b/src/main/java/com/delfood/mapper/DeliveryMapper.java index c44f249..5204d1b 100644 --- a/src/main/java/com/delfood/mapper/DeliveryMapper.java +++ b/src/main/java/com/delfood/mapper/DeliveryMapper.java @@ -1,8 +1,10 @@ package com.delfood.mapper; +import java.time.LocalDate; import java.util.List; import org.springframework.stereotype.Repository; import com.delfood.dto.rider.DeliveryInfoDTO; +import com.delfood.dto.rider.DeliveryOrderInfo; @Repository public interface DeliveryMapper { @@ -10,4 +12,6 @@ public interface DeliveryMapper { List findByRiderId(String riderId, Long lastViewedOrderId); DeliveryInfoDTO findCurrentDeliveryByRiderId(String riderId); + + List findTodayBillsByRiderId(String riderId, LocalDate today); } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index 8f24685..b1de776 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -6,12 +6,14 @@ import com.delfood.dto.push.PushMessage; import com.delfood.dto.rider.AcceptDeliveryRequestDTO; import com.delfood.dto.rider.DeliveryInfoDTO; +import com.delfood.dto.rider.DeliveryOrderInfo; import com.delfood.dto.rider.DeliveryRiderDTO; import com.delfood.mapper.DeliveryMapper; import com.delfood.mapper.RiderInfoMapper; import com.delfood.service.OrderService; import com.delfood.service.PushService; import lombok.NonNull; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import javax.annotation.Nullable; @@ -144,4 +146,9 @@ public DeliveryInfoDTO getCurrentDelivery(String riderId) { return deliveryMapper.findCurrentDeliveryByRiderId(riderId); } + public List getTodayDeliveryBills(String riderId) { + LocalDate today = LocalDate.now(); + return deliveryMapper.findTodayBillsByRiderId(riderId, today); + } + } diff --git a/src/main/resources/mybatis/mapper/delivery.xml b/src/main/resources/mybatis/mapper/delivery.xml index 49e9b7a..19673b0 100644 --- a/src/main/resources/mybatis/mapper/delivery.xml +++ b/src/main/resources/mybatis/mapper/delivery.xml @@ -73,4 +73,11 @@ AND odr.status = 'IN_DELIVERY' ORDER BY odr.id DESC + + From da0fdced7ee6f31923af5ddc204ce6323f7fe784 Mon Sep 17 00:00:00 2001 From: yyy99 Date: Wed, 22 Jan 2020 12:51:37 +0900 Subject: [PATCH 11/13] =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/delfood/controller/RiderController.java | 2 +- .../dao/deliveery/LocalMemoryDeliveryDao.java | 3 ++- .../service/delivery/DeliveryService.java | 13 ++++++++++++- .../delfood/service/rider/RiderInfoService.java | 5 +++++ src/main/resources/mybatis/mapper/delivery.xml | 16 ++++++++-------- src/main/resources/mybatis/mapper/orders.xml | 2 +- src/main/resources/mybatis/mapper/rider.xml | 2 +- 7 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index fdc2dbf..8cd0725 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -99,7 +99,6 @@ public RiderDTO signIn(@RequestBody SignInRequest request, HttpSession session) if (Objects.isNull(SessionUtil.getLoginRiderId(session)) == false) { logout(session); } - RiderDTO riderInfo = riderInfoService.signIn(request.getId(), request.getPassword()); SessionUtil.setLoginRiderId(session, riderInfo.getId()); return riderInfo; @@ -149,6 +148,7 @@ public void deleteRiderAccount(HttpSession session, String password) { * @param request 요청 정보 */ @PatchMapping("mail") + @LoginCheck(type = UserType.RIDER) public void updateMail(HttpSession session, @RequestBody UpdateMailRequest request) { String id = SessionUtil.getLoginRiderId(session); riderInfoService.changeMail(id, request.getPassword(), request.getUpdateMail()); diff --git a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java index 2358a55..4adaa25 100644 --- a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java @@ -124,7 +124,8 @@ public void deleteAll(List idList) { public OrderStatus getOrderStatus(Long orderId) { return orders.computeIfAbsent(orderId, key -> { OrderStatus status = orderService.getOrderStatus(orderId); - setOrderStatus(orderId, status); + // 데드락 발생으로 인한 임시 주석 +// setOrderStatus(orderId, status); return status; }); } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index b1de776..f167815 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -13,9 +13,11 @@ import com.delfood.service.OrderService; import com.delfood.service.PushService; import lombok.NonNull; +import lombok.extern.log4j.Log4j2; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; import javax.annotation.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -23,6 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Log4j2 @Service public class DeliveryService { @@ -91,8 +94,15 @@ public void deliveryRequestByDistance(Position position, long distance) { public AcceptDeliveryRequestDTO acceptDeliveryRequest(@NonNull String riderId, @NonNull Long orderId) { OrderStatus status = deliveryDao.getOrderStatus(orderId); + + if (Objects.isNull(status)) { + log.info("잘못된 주문번호를 수락 시도. 라이더 아이디 : {}, 주문 번호 : {}", riderId, orderId); + throw new IllegalArgumentException("존재하지 않는 주문 번호입니다."); + } + AcceptDeliveryRequestDTO result; - if (OrderStatus.ORDER_REQUEST.equals(status)) { + if (OrderStatus.ORDER_APPROVAL.equals(status)) { + log.info("매칭 성공"); deliveryDao.setOrderStatus(orderId, OrderStatus.IN_DELIVERY); orderService.setRider(orderId, riderId); result = AcceptDeliveryRequestDTO.builder() @@ -101,6 +111,7 @@ public AcceptDeliveryRequestDTO acceptDeliveryRequest(@NonNull String riderId, .result(AcceptDeliveryRequestDTO.RequestResult.SUCCESS) .build(); } else { + log.info("매칭 실패"); result = AcceptDeliveryRequestDTO.builder() .orderId(orderId) .riderId(riderId) diff --git a/src/main/java/com/delfood/service/rider/RiderInfoService.java b/src/main/java/com/delfood/service/rider/RiderInfoService.java index f96ed8b..9de5e94 100644 --- a/src/main/java/com/delfood/service/rider/RiderInfoService.java +++ b/src/main/java/com/delfood/service/rider/RiderInfoService.java @@ -56,6 +56,11 @@ public RiderDTO signIn(@NonNull String id, @NonNull String password) { String encryptedPassword = SHA256Util.encryptSHA256(password); RiderDTO riderInfo = getRiderInfo(id, encryptedPassword); + if (Objects.isNull(riderInfo)) { + throw new IllegalArgumentException("라이더의 아이디와 비밀번호가 일치하지 않습니다."); + } + + if (RiderDTO.Status.DELETED.equals(riderInfo.getStatus())) { log.info("signIn - 삭제 회원 로그인 시도. id : {}, password : {}", id, encryptedPassword); throw new IdDeletedException("Rider의 계정이 삭제 상태입니다. 로그인할 수 없습니다."); diff --git a/src/main/resources/mybatis/mapper/delivery.xml b/src/main/resources/mybatis/mapper/delivery.xml index 19673b0..bdf6882 100644 --- a/src/main/resources/mybatis/mapper/delivery.xml +++ b/src/main/resources/mybatis/mapper/delivery.xml @@ -21,7 +21,7 @@ - + @@ -39,11 +39,11 @@ odr.address_detail addressDetail, shop.id shopId, shop.name shopName, - odr.id order_id, + odr.id orderId, odr.delivery_cost deliveryCost, odr.order_status orderStatus FROM ORDERS odr INNER JOIN SHOP shop ON (odr.shop_id = shop.id) - INNER JOIN ADDRESS addr ON (odr.address_code = ADDRESS.building_management_number) + INNER JOIN ADDRESS addr ON (odr.address_code = addr.building_management_number) WHERE odr.rider_id = #{riderId} AND odr.id > #{lastViewedOrderId} @@ -64,20 +64,20 @@ odr.address_detail addressDetail, shop.id shopId, shop.name shopName, - odr.id order_id, + odr.id orderId, odr.delivery_cost deliveryCost, odr.order_status orderStatus FROM ORDERS odr INNER JOIN SHOP shop ON (odr.shop_id = shop.id) - INNER JOIN ADDRESS addr ON (odr.address_code = ADDRESS.building_management_number) + INNER JOIN ADDRESS addr ON (odr.address_code = addr.building_management_number) WHERE odr.rider_id = #{riderId} - AND odr.status = 'IN_DELIVERY' + AND odr.order_status = 'IN_DELIVERY' ORDER BY odr.id DESC diff --git a/src/main/resources/mybatis/mapper/orders.xml b/src/main/resources/mybatis/mapper/orders.xml index b04a8c6..55e2b66 100644 --- a/src/main/resources/mybatis/mapper/orders.xml +++ b/src/main/resources/mybatis/mapper/orders.xml @@ -378,7 +378,7 @@ UPDATE ORDERS - SET rider_id = #{riderId}. + SET rider_id = #{riderId}, order_status = 'IN_DELIVERY' WHERE id = #{orderId} diff --git a/src/main/resources/mybatis/mapper/rider.xml b/src/main/resources/mybatis/mapper/rider.xml index 692a649..57b2d9b 100644 --- a/src/main/resources/mybatis/mapper/rider.xml +++ b/src/main/resources/mybatis/mapper/rider.xml @@ -55,7 +55,7 @@ AND rider_id = #{riderId} - SELECT COUNT(*) > 0 FROM ORDERS WHERE rider_id = #{riderId} From 5d952ca574941d806d05d9c83670abc2bf35c04d Mon Sep 17 00:00:00 2001 From: Jun Date: Wed, 22 Jan 2020 14:32:09 +0900 Subject: [PATCH 12/13] =?UTF-8?q?-=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20-=20=20=EB=9D=BC=EC=9D=B4=EB=8D=94=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=EC=9D=B4=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20ConcurrentHashMap=EC=9D=B4=20=EB=A9=88=EC=B6=94?= =?UTF-8?q?=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delfood/controller/RiderController.java | 19 +++++++++++++++---- .../dao/deliveery/LocalMemoryDeliveryDao.java | 6 ++---- .../delfood/dto/rider/DeliveryRiderDTO.java | 10 ++++++++-- .../com/delfood/mapper/DeliveryMapper.java | 2 +- .../service/delivery/DeliveryService.java | 8 +++++--- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index 8cd0725..b59d429 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -4,6 +4,7 @@ import com.delfood.aop.OwnerShopCheck; import com.delfood.aop.LoginCheck.UserType; import com.delfood.aop.RiderLoginCheck; +import com.delfood.dto.address.Position; import com.delfood.dto.rider.AcceptDeliveryRequestDTO; import com.delfood.dto.rider.DeliveryRiderDTO; import com.delfood.dto.rider.AcceptDeliveryRequestDTO.RequestResult; @@ -189,19 +190,20 @@ public void deliveryComplete(@RequestBody DeliveryCompleteRequest request, HttpS * 라이더의 현제 위치 정보를 업데이트한다. * 새로운 정보를 덧씌우는 것이기 때문에 put으로 매핑하였다. * @author jun - * @param info 요청 정보 + * @param request 요청 정보 * @param session 현재 세션 */ @PutMapping("delivery/available") @LoginCheck(type = UserType.RIDER) - public void updateDeliveryRiderInfo(DeliveryRiderDTO info, HttpSession session) { + public void updateDeliveryRiderInfo(UpdateDeliveryRiderInfoRequest request, HttpSession session) { String riderId = SessionUtil.getLoginRiderId(session); if (riderInfoService.hasDelivery(riderId)) { throw new DuplicateException("이미 진행중인 배달이 있습니다. 한번에 하나의 배달만 가능합니다."); } - deliveryService.updateRider(info); + deliveryService.updateRider( + DeliveryRiderDTO.builder().position(request.getPosition()).riderId(riderId).build()); } /** @@ -247,7 +249,7 @@ public DeliveryInfoDTO getCurrentDelivery(HttpSession session) { /** * 오늘 배달한 배달료를 조회한다. * @param session 현제 세션 - * @return + * @return */ @GetMapping("delivery/bills/today") @LoginCheck(type = UserType.RIDER) @@ -299,6 +301,15 @@ private static class DeliveryCompleteRequest { private Long orderId; } + @Getter + private static class UpdateDeliveryRiderInfoRequest { + @NonNull + private Position position; + } + + + // response + @Getter private static class TodayDeliveryBillsResponse { private List deliveries; diff --git a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java index 4adaa25..d224a62 100644 --- a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java @@ -47,7 +47,7 @@ public void init() { */ @Override public void updateRiderInfo(DeliveryRiderDTO riderInfo) { - riders.put(riderInfo.getId(), riderInfo); + riders.put(riderInfo.getRiderId(), riderInfo); } /** @@ -91,7 +91,7 @@ public void deleteNonUpdatedRiders() { riders.values().stream() .filter( e -> ChronoUnit.SECONDS.between(e.getUpdatedAt(), LocalDateTime.now()) > expireTime) - .forEach(e -> riders.remove(e.getId())); + .forEach(e -> riders.remove(e.getRiderId())); } /** @@ -124,8 +124,6 @@ public void deleteAll(List idList) { public OrderStatus getOrderStatus(Long orderId) { return orders.computeIfAbsent(orderId, key -> { OrderStatus status = orderService.getOrderStatus(orderId); - // 데드락 발생으로 인한 임시 주석 -// setOrderStatus(orderId, status); return status; }); } diff --git a/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java index 09815b8..a2d3cbd 100644 --- a/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java +++ b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java @@ -2,19 +2,25 @@ import java.time.LocalDateTime; import com.delfood.dto.address.Position; +import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @EqualsAndHashCode(of = "id") +@NoArgsConstructor public class DeliveryRiderDTO { - private String id; + private String riderId; private Position position; private LocalDateTime updatedAt; - public DeliveryRiderDTO() { + @Builder + public DeliveryRiderDTO(String riderId, Position position, LocalDateTime updatedAt) { + this.riderId = riderId; + this.position = position; this.updatedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/delfood/mapper/DeliveryMapper.java b/src/main/java/com/delfood/mapper/DeliveryMapper.java index 5204d1b..3533f06 100644 --- a/src/main/java/com/delfood/mapper/DeliveryMapper.java +++ b/src/main/java/com/delfood/mapper/DeliveryMapper.java @@ -13,5 +13,5 @@ public interface DeliveryMapper { DeliveryInfoDTO findCurrentDeliveryByRiderId(String riderId); - List findTodayBillsByRiderId(String riderId, LocalDate today); + List findTodayBillsByRiderId(String riderId); } diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index f167815..06f24e4 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -80,11 +80,13 @@ public void deliveryRequestByDistance(Position position, long distance) { double distanceE1 = position.distanceMeter(e1.getPosition()); double distanceE2 = position.distanceMeter(e2.getPosition()); return distanceE1 - distanceE2 > 0 ? 1 : distanceE1 - distanceE2 < 0 ? -1 : 0; - }).forEach(e -> pushService.sendMessageToRider(PushMessage.DELIVERY_REQUEST, e.getId())); + }) + .forEach(e -> pushService.sendMessageToRider(PushMessage.DELIVERY_REQUEST, e.getRiderId())); } - + /** * 배달원을 매칭한다. + * * @author jun * @param riderId 라이더 아이디 * @param orderId 주문 아이디 @@ -159,7 +161,7 @@ public DeliveryInfoDTO getCurrentDelivery(String riderId) { public List getTodayDeliveryBills(String riderId) { LocalDate today = LocalDate.now(); - return deliveryMapper.findTodayBillsByRiderId(riderId, today); + return deliveryMapper.findTodayBillsByRiderId(riderId); } } From 9b49198b4a74c007e2a5599ba87a06897ea07939 Mon Sep 17 00:00:00 2001 From: Jun Date: Thu, 23 Jan 2020 19:06:16 +0900 Subject: [PATCH 13/13] =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/delfood/controller/RiderController.java | 8 +++++--- .../com/delfood/dao/deliveery/DeliveryDao.java | 2 ++ .../dao/deliveery/LocalMemoryDeliveryDao.java | 13 ++++++++----- .../java/com/delfood/dto/address/Position.java | 14 +++++++------- .../com/delfood/dto/rider/DeliveryRiderDTO.java | 7 +++++-- .../service/delivery/DeliveryService.java | 7 +++++++ .../com/delfood/service/AddressServiceTest.java | 16 ++++++++-------- 7 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/delfood/controller/RiderController.java b/src/main/java/com/delfood/controller/RiderController.java index b59d429..de9c609 100644 --- a/src/main/java/com/delfood/controller/RiderController.java +++ b/src/main/java/com/delfood/controller/RiderController.java @@ -170,7 +170,7 @@ public AcceptDeliveryRequestDTO deliveryAccept(@RequestBody DeliveryAcceptReques } /** - * 해당 주문의 배달을 완료했다는 요청을 받는다. + * 해당 주문의 배달을 완료한다. * @author jun * @param request 요청 정보 * @param session 현제 세션 @@ -195,9 +195,11 @@ public void deliveryComplete(@RequestBody DeliveryCompleteRequest request, HttpS */ @PutMapping("delivery/available") @LoginCheck(type = UserType.RIDER) - public void updateDeliveryRiderInfo(UpdateDeliveryRiderInfoRequest request, HttpSession session) { + public void updateDeliveryRiderInfo(@RequestBody UpdateDeliveryRiderInfoRequest request, + HttpSession session) { + log.info("포지션 : {}", request.getPosition()); String riderId = SessionUtil.getLoginRiderId(session); - + if (riderInfoService.hasDelivery(riderId)) { throw new DuplicateException("이미 진행중인 배달이 있습니다. 한번에 하나의 배달만 가능합니다."); } diff --git a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java index 5365a38..8b2c19d 100644 --- a/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/DeliveryDao.java @@ -3,6 +3,7 @@ import com.delfood.dto.OrderDTO.OrderStatus; import com.delfood.dto.address.Position; import com.delfood.dto.rider.DeliveryRiderDTO; +import lombok.NonNull; import java.util.List; public interface DeliveryDao { @@ -26,4 +27,5 @@ public interface DeliveryDao { void setOrderStatus(Long orderId, OrderStatus status); void deleteOrderStatus(Long orderId); + } diff --git a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java index d224a62..48ed352 100644 --- a/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java +++ b/src/main/java/com/delfood/dao/deliveery/LocalMemoryDeliveryDao.java @@ -4,7 +4,7 @@ import com.delfood.dto.address.Position; import com.delfood.dto.rider.DeliveryRiderDTO; import com.delfood.service.OrderService; - +import lombok.extern.log4j.Log4j2; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Comparator; @@ -23,6 +23,7 @@ @Repository("multiThreadDeliveryDao") @ThreadSafe +@Log4j2 public class LocalMemoryDeliveryDao implements DeliveryDao{ private ConcurrentHashMap riders; private ConcurrentHashMap orders; @@ -89,11 +90,13 @@ public List getRiderList() { @Override public void deleteNonUpdatedRiders() { riders.values().stream() - .filter( - e -> ChronoUnit.SECONDS.between(e.getUpdatedAt(), LocalDateTime.now()) > expireTime) - .forEach(e -> riders.remove(e.getRiderId())); + .filter(e -> ChronoUnit.SECONDS.between(e.getUpdatedAt(), LocalDateTime.now()) > expireTime) + .forEach(e -> { + log.info("라이더 : {} 가 매칭 대기 목록에서 자동 삭제됨.", e.getRiderId()); + riders.remove(e.getRiderId()); + }); } - + /** * 라이더의 정보를 조회한다. * @author jun diff --git a/src/main/java/com/delfood/dto/address/Position.java b/src/main/java/com/delfood/dto/address/Position.java index b3fd59e..9e8cbd9 100644 --- a/src/main/java/com/delfood/dto/address/Position.java +++ b/src/main/java/com/delfood/dto/address/Position.java @@ -7,13 +7,13 @@ @Getter @NoArgsConstructor public class Position { - private double xPos; - private double yPos; + private double coordinateX; + private double coordinateY; @Builder - public Position(double xPos, double yPos) { - this.xPos = xPos; - this.yPos = yPos; + public Position(double coordinateX, double coordinateY) { + this.coordinateX = coordinateX; + this.coordinateY = coordinateY; } /** @@ -23,7 +23,7 @@ public Position(double xPos, double yPos) { * @return */ public double distanceMeter(Position position) { - return Math.sqrt( - Math.pow(this.xPos - position.getXPos(), 2) + Math.pow(this.yPos - position.getYPos(), 2)); + return Math.sqrt(Math.pow(this.coordinateX - position.getCoordinateX(), 2) + + Math.pow(this.coordinateY - position.getCoordinateY(), 2)); } } diff --git a/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java index a2d3cbd..017e7c4 100644 --- a/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java +++ b/src/main/java/com/delfood/dto/rider/DeliveryRiderDTO.java @@ -6,16 +6,19 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.NonNull; @Getter @EqualsAndHashCode(of = "id") -@NoArgsConstructor public class DeliveryRiderDTO { + @NonNull private String riderId; + @NonNull private Position position; - private LocalDateTime updatedAt; + @NonNull + private LocalDateTime updatedAt = LocalDateTime.now(); @Builder public DeliveryRiderDTO(String riderId, Position position, LocalDateTime updatedAt) { diff --git a/src/main/java/com/delfood/service/delivery/DeliveryService.java b/src/main/java/com/delfood/service/delivery/DeliveryService.java index 06f24e4..dff694d 100644 --- a/src/main/java/com/delfood/service/delivery/DeliveryService.java +++ b/src/main/java/com/delfood/service/delivery/DeliveryService.java @@ -53,6 +53,8 @@ public class DeliveryService { * @param riderInfo 추가할 라이더의 정보 */ public void updateRider(@NonNull DeliveryRiderDTO riderInfo) { + log.info("라이더 정보 수신 후 업데이트 진행. 라이더 아이디 : {}, 위치 : x - {}, y - {}", riderInfo.getRiderId(), + riderInfo.getPosition().getCoordinateX(), riderInfo.getPosition().getCoordinateY()); deliveryDao.updateRiderInfo(riderInfo); } @@ -65,6 +67,7 @@ public DeliveryRiderDTO getRider(@NonNull String riderId) { */ @Scheduled(fixedRate = SCHEDULE_DELETE_DELIVERY_RIDER_SECOND) // 5분에 한번씩 실행시킨다 public void deleteBySchedule() { + log.info("업데이트 되지 않는 라이더 삭제 시작"); deliveryDao.deleteNonUpdatedRiders(); } @@ -133,7 +136,11 @@ public AcceptDeliveryRequestDTO acceptDeliveryRequest(@NonNull String riderId, */ public void deliveryComplete(@NonNull Long orderId) { LocalDateTime completeTime = LocalDateTime.now(); + if (OrderStatus.IN_DELIVERY.equals(deliveryDao.getOrderStatus(orderId)) == false) { + throw new IllegalArgumentException("주문이 현제 배달중인 상태가 아닙니다."); + } orderService.completeOrder(orderId, completeTime); + deliveryDao.setOrderStatus(orderId, OrderStatus.DELIVERY_COMPLETE); } /** diff --git a/src/test/java/com/delfood/service/AddressServiceTest.java b/src/test/java/com/delfood/service/AddressServiceTest.java index 96f830b..5c4d674 100644 --- a/src/test/java/com/delfood/service/AddressServiceTest.java +++ b/src/test/java/com/delfood/service/AddressServiceTest.java @@ -111,13 +111,13 @@ public AddressDTO generateAddressDTO() { @Test public void getDistanceMeterTest_거리_계산() { Position startPosition = Position.builder() - .xPos(0.0) - .yPos(0.0) + .coordinateX(0.0) + .coordinateY(0.0) .build(); Position endPosition = Position.builder() - .xPos(300.0) - .yPos(400.0) + .coordinateX(300.0) + .coordinateY(400.0) .build(); given(addressMapper.findPositionByAddressCode("11111111")).willReturn(startPosition); @@ -146,13 +146,13 @@ public AddressDTO generateAddressDTO() { @Test public void deliveryPriceTest_아이디기반_배달료_계산() { Position memberPosition = Position.builder() - .xPos(0.0) - .yPos(0.0) + .coordinateX(0.0) + .coordinateY(0.0) .build(); Position shopPosition = Position.builder() - .xPos(3000.0) - .yPos(4000.0) + .coordinateX(3000.0) + .coordinateY(4000.0) .build(); given(addressMapper.findPositionByMemberId("eric")).willReturn(memberPosition);