Skip to content
This repository was archived by the owner on Aug 13, 2022. It is now read-only.

[#70] 배달 매칭 서비스 #69

Open
wants to merge 18 commits into
base: rider_info_service
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 109 additions & 2 deletions src/main/java/com/delfood/controller/RiderController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -41,6 +50,9 @@ public class RiderController {
@Autowired
private DeliveryService deliveryService;

@Autowired
private OrderService orderService;

/**
* 아이디 중복 체크.
* @author jun
Expand Down Expand Up @@ -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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모습을 보니 떠오른건데 type보다는 level이 어떨까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

level도 생각해보았는데 뭔가 접근의 계층이 있어야 할것같은 느낌이라서요. 제가 만든 로그인은 3가지의 전혀 다른 타입이라서 일단 타입으로 해두었습니다.

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<DeliveryInfoDTO> 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")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 배달중인 라이더의 정보를 조회할 요구사항이 생기면 {riderId}와 겹치지 않을까요?

@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 {
Expand Down Expand Up @@ -173,6 +275,11 @@ private static class UpdateMailRequest {
private String updateMail;
}

@Getter
private static class DeliveryCompleteRequest {
@NonNull
private Long orderId;
}


}
19 changes: 19 additions & 0 deletions src/main/java/com/delfood/dto/SimpleShopInfo.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
41 changes: 41 additions & 0 deletions src/main/java/com/delfood/dto/rider/DeliveryInfoDTO.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/delfood/dto/rider/DeliveryOrderInfo.java
Original file line number Diff line number Diff line change
@@ -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;

}
13 changes: 13 additions & 0 deletions src/main/java/com/delfood/mapper/DeliveryMapper.java
Original file line number Diff line number Diff line change
@@ -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<DeliveryInfoDTO> findByRiderId(String riderId, Long lastViewedOrderId);

DeliveryInfoDTO findCurrentDeliveryByRiderId(String riderId);
}
4 changes: 4 additions & 0 deletions src/main/java/com/delfood/mapper/OrderMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
4 changes: 4 additions & 0 deletions src/main/java/com/delfood/mapper/RiderInfoMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
16 changes: 16 additions & 0 deletions src/main/java/com/delfood/service/OrderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


}
53 changes: 51 additions & 2 deletions src/main/java/com/delfood/service/delivery/DeliveryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,6 +36,12 @@ public class DeliveryService {
@Autowired
private OrderService orderService;

@Autowired
private RiderInfoMapper riderInfoMapper;

@Autowired
private DeliveryMapper deliveryMapper;

/**
* 라이더의 정보를 업데이트한다.
* 라이더의 정보가 저장되어 있지 않을 시 저장소에 라이더 정보를 추가한다.
Expand Down Expand Up @@ -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)
Expand All @@ -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<DeliveryInfoDTO> getMyAllDeliveries(String riderId,
@Nullable Long lastViewedOrderId) {
return deliveryMapper.findByRiderId(riderId, lastViewedOrderId);
}

public DeliveryInfoDTO getCurrentDelivery(String riderId) {
return deliveryMapper.findCurrentDeliveryByRiderId(riderId);
}

}
4 changes: 4 additions & 0 deletions src/main/java/com/delfood/service/rider/RiderInfoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Loading