From 0b9691d8dbc735a90568d982241257def3a4b717 Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 16:23:14 +0900 Subject: [PATCH 1/7] refactor: update parameter --- .../java/co/orange/ddanzi/service/PaymentService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/co/orange/ddanzi/service/PaymentService.java b/src/main/java/co/orange/ddanzi/service/PaymentService.java index c35334b..55d5d05 100644 --- a/src/main/java/co/orange/ddanzi/service/PaymentService.java +++ b/src/main/java/co/orange/ddanzi/service/PaymentService.java @@ -92,7 +92,7 @@ public ApiResponse endPayment(UpdatePaymentRequestDto requestDto){ if(newItem == null){ log.info("환불을 진행합니다."); try { - refundPayment(buyer, order); + refundPayment(buyer, order, "현재 남은 재고가 없어 고객에게 결제 금액 환불합니다."); payment.updatePaymentStatusAndEndedAt(PayStatus.CANCELLED); historyService.createPaymentHistoryWithError(buyer, payment, "재고 없음- 환불 처리"); fcmService.sendMessageToAdmin(FcmCase.C3); @@ -146,7 +146,7 @@ public ApiResponse refundTest(UpdatePaymentRequestDto requestDto){ User buyer = authUtils.getUser(); Order order = orderService.getOrderRecord(requestDto.getOrderId()); Payment payment = paymentRepository.findByOrder(order); - refundPayment(buyer, order); + refundPayment(buyer, order, "테스트용 환불입니다."); return ApiResponse.onSuccess(Success.SUCCESS, true); } @@ -181,7 +181,7 @@ public String getPortOneAccessToken(){ return response.getBody().getResponse().getAccess_token(); } - public void refundPayment(User user, Order order){ + public void refundPayment(User user, Order order, String reason){ if(!user.equals(order.getBuyer())) throw new RuntimeException("결제자와 요청자가 다르므로 환불이 어렵습니다."); String baseUrl = "https://api.iamport.kr/payments/cancel"; @@ -196,7 +196,7 @@ public void refundPayment(User user, Order order){ RefundRequestDto requestDto = RefundRequestDto.builder() .merchant_uid(order.getId()) - .reason("현재 남은 재고가 없어 고객에게 결제 금액 환불합니다.") + .reason(reason) .build(); HttpEntity entity = new HttpEntity<>(requestDto, headers); From 484029c4a1d3ac332103dc72c403b2c0b10c924d Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 16:23:23 +0900 Subject: [PATCH 2/7] feat: add refund func --- src/main/java/co/orange/ddanzi/service/OrderService.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/co/orange/ddanzi/service/OrderService.java b/src/main/java/co/orange/ddanzi/service/OrderService.java index 8615b44..9354735 100644 --- a/src/main/java/co/orange/ddanzi/service/OrderService.java +++ b/src/main/java/co/orange/ddanzi/service/OrderService.java @@ -170,11 +170,6 @@ public Order getOrderRecord(String orderId){ return orderRepository.findById(orderId).orElseThrow(() -> new OrderNotFoundException()); } - /** - * 환불 API 붙이기!!!!!! - * - * - */ @Transactional public void checkOrderPlacedOrder(){ //입금 후 1일(24시간)이 지났는데, 판매확정이 되지 않았을 시 - 거래 취소 @@ -183,6 +178,7 @@ public void checkOrderPlacedOrder(){ for(Order order : orderPlaceOrders){ fcmService.sendMessageToUser(order.getItem().getSeller(), FcmCase.A2, order); fcmService.sendMessageToUser(order.getBuyer(), FcmCase.B1, order); + paymentService.refundPayment(order.getBuyer(), order, "고객이 판매확정을 하지 않아 거래가 취소되어 결제 금액을 환불합니다."); order.updateStatus(OrderStatus.CANCELLED); } } From 370f100d69275643a11d38ab436fbb9c943b6669 Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 17:41:00 +0900 Subject: [PATCH 3/7] feat: implement delete item api --- .../ddanzi/controller/ItemController.java | 5 ++ .../co/orange/ddanzi/service/ItemService.java | 51 +++++++++++++++---- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/main/java/co/orange/ddanzi/controller/ItemController.java b/src/main/java/co/orange/ddanzi/controller/ItemController.java index 0e31ce0..adacd22 100644 --- a/src/main/java/co/orange/ddanzi/controller/ItemController.java +++ b/src/main/java/co/orange/ddanzi/controller/ItemController.java @@ -48,6 +48,11 @@ ApiResponse getItem(@PathVariable("id") String id) { return itemService.getItem(id); } + @DeleteMapping("/{id}") + ApiResponse deleteItem(@PathVariable("id") String id) { + return itemService.deleteItem(id); + } + @GetMapping("/order/{id}") ApiResponse getAddressAndOption(@PathVariable("id") String id) { return itemService.getAddressAndOption(id); diff --git a/src/main/java/co/orange/ddanzi/service/ItemService.java b/src/main/java/co/orange/ddanzi/service/ItemService.java index 16041ce..c079780 100644 --- a/src/main/java/co/orange/ddanzi/service/ItemService.java +++ b/src/main/java/co/orange/ddanzi/service/ItemService.java @@ -7,11 +7,13 @@ import co.orange.ddanzi.domain.order.Order; import co.orange.ddanzi.domain.order.OrderOptionDetail; import co.orange.ddanzi.domain.order.Payment; +import co.orange.ddanzi.domain.order.enums.PayStatus; import co.orange.ddanzi.domain.product.Discount; import co.orange.ddanzi.domain.product.Item; import co.orange.ddanzi.domain.product.Product; import co.orange.ddanzi.domain.product.enums.ItemStatus; import co.orange.ddanzi.domain.user.User; +import co.orange.ddanzi.domain.user.enums.FcmCase; import co.orange.ddanzi.dto.common.AddressSeparateInfo; import co.orange.ddanzi.dto.item.*; import co.orange.ddanzi.common.error.Error; @@ -22,6 +24,7 @@ import co.orange.ddanzi.repository.*; import co.orange.ddanzi.service.common.AddressService; import co.orange.ddanzi.service.common.GcsService; +import co.orange.ddanzi.service.common.HistoryService; import co.orange.ddanzi.service.common.TermService; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -48,14 +51,13 @@ public class ItemService { private final OrderOptionDetailRepository orderOptionDetailRepository; private final InterestProductRepository interestProductRepository; - @Autowired - GcsService gcsService; - @Autowired - TermService termService; - @Autowired - AddressService addressService; - @Autowired - private PaymentRepository paymentRepository; + private final GcsService gcsService; + private final TermService termService; + private final AddressService addressService; + private final PaymentService paymentService; + private final PaymentRepository paymentRepository; + private final HistoryService historyService; + @Transactional public ApiResponse createSignedUrl(String fileName){ @@ -106,7 +108,7 @@ public ApiResponse getItem(String itemId){ return ApiResponse.onFailure(Error.ITEM_UNAUTHORIZED_USER, null); //get latest order - Order order = orderRepository.findByItemAnAndStatus(item).orElse(null); + Order order = orderRepository.findByItemAndStatus(item).orElse(null); Payment payment = null; if(order!=null) @@ -132,6 +134,37 @@ public ApiResponse getItem(String itemId){ return ApiResponse.onSuccess(Success.GET_ITEM_PRODUCT_SUCCESS, responseDto); } + @Transactional + public ApiResponse deleteItem(String itemId){ + User user = authUtils.getUser(); + Item item = itemRepository.findById(itemId).orElseThrow(ItemNotFoundException::new); + if(!item.getSeller().equals(user)) + return ApiResponse.onFailure(Error.ITEM_UNAUTHORIZED_USER, null); + + Order order = orderRepository.findByItemAndStatus(item).orElse(null); + if(order==null){ + log.info("거래 취소 중 - 거래중이지 않아 바로 제품을 삭제합니다."); + item.updateStatus(ItemStatus.DELETED); + } + else{ + log.info("거래 취소 중 - 거래중인 상품이 있습니다. 대안을 탐색합니다."); + Item newItem = itemRepository.findNearestExpiryItem(item.getProduct()).orElse(null); + if(newItem == null) { + log.info("환불을 진행합니다."); + Payment payment = paymentRepository.findByOrder(order); + User buyer = order.getBuyer(); + try { + paymentService.refundPayment(buyer, order, "현재 남은 재고가 없어 고객에게 결제 금액 환불합니다."); + payment.updatePaymentStatusAndEndedAt(PayStatus.CANCELLED); + historyService.createPaymentHistoryWithError(buyer, payment, "재퓸 삭제- 환불 처리 성공"); + }catch (Exception e){ + historyService.createPaymentHistoryWithError(buyer, payment, "제품 삭제 - 환불 처리 실패"); + return ApiResponse.onFailure(Error.REFUND_FAILED, Map.of("orderId", order.getId())); + } + } + } + return ApiResponse.onSuccess(Success.DELETE_ITEM_SUCCESS, true); + } @Transactional public ApiResponse getAddressAndOption(String orderId){ From 20f575c2ae84e6592a794998e00a76cf05379b95 Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 17:41:27 +0900 Subject: [PATCH 4/7] fix: typo --- src/main/java/co/orange/ddanzi/repository/OrderRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/co/orange/ddanzi/repository/OrderRepository.java b/src/main/java/co/orange/ddanzi/repository/OrderRepository.java index 2d4a1ba..112ea0b 100644 --- a/src/main/java/co/orange/ddanzi/repository/OrderRepository.java +++ b/src/main/java/co/orange/ddanzi/repository/OrderRepository.java @@ -18,7 +18,7 @@ public interface OrderRepository extends JpaRepository { List findByBuyerAndStatus(User user); @Query("SELECT o FROM Order o WHERE o.item = :item AND o.status <> 'ORDER_PENDING'") - Optional findByItemAnAndStatus(@Param("item") Item item); + Optional findByItemAndStatus(@Param("item") Item item); @Query("SELECT o FROM Order o WHERE o.status = :orderStatus AND o.updatedAt <= :dateTime") List findOverLimitTimeOrders(OrderStatus orderStatus, LocalDateTime dateTime); From addb2dfa8358577fe470beefd144b2e72865dc1c Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 17:41:40 +0900 Subject: [PATCH 5/7] feat: add condition for refund --- .../java/co/orange/ddanzi/service/PaymentService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/co/orange/ddanzi/service/PaymentService.java b/src/main/java/co/orange/ddanzi/service/PaymentService.java index 55d5d05..a4a08cd 100644 --- a/src/main/java/co/orange/ddanzi/service/PaymentService.java +++ b/src/main/java/co/orange/ddanzi/service/PaymentService.java @@ -86,16 +86,15 @@ public ApiResponse endPayment(UpdatePaymentRequestDto requestDto){ return ApiResponse.onFailure(Error.PAYMENT_CANNOT_CHANGE, null); } - if(item.getStatus().equals(ItemStatus.IN_TRANSACTION)){ - log.info("해당 제품은 이미 결제 되어 새로운 제품을 탐색합니다."); + if(item.getStatus().equals(ItemStatus.IN_TRANSACTION) || item.getStatus().equals(ItemStatus.DELETED)){ + log.info("해당 제품은 거래불가능하여 새로운 제품을 탐색합니다."); Item newItem = itemRepository.findNearestExpiryItem(product).orElse(null); if(newItem == null){ log.info("환불을 진행합니다."); try { refundPayment(buyer, order, "현재 남은 재고가 없어 고객에게 결제 금액 환불합니다."); payment.updatePaymentStatusAndEndedAt(PayStatus.CANCELLED); - historyService.createPaymentHistoryWithError(buyer, payment, "재고 없음- 환불 처리"); - fcmService.sendMessageToAdmin(FcmCase.C3); + historyService.createPaymentHistoryWithError(buyer, payment, "재고 없음- 환불 처리 성공"); return ApiResponse.onFailure(Error.NO_ITEM_ON_SALE, Map.of("orderId", order.getId())); }catch (Exception e){ historyService.createPaymentHistoryWithError(buyer, payment, "재고 없음 - 환불 처리 실패"); @@ -205,6 +204,7 @@ public void refundPayment(User user, Order order, String reason){ RestTemplate restTemplate = new RestTemplate(); restTemplate.postForObject(url, entity, String.class); log.info("결제 취소 api 호출"); + fcmService.sendMessageToAdmin(FcmCase.C3); } } From e22e33ad1520fdd028ea1f13a15ab916771e42cd Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 17:41:49 +0900 Subject: [PATCH 6/7] chore: add status --- .../java/co/orange/ddanzi/domain/product/enums/ItemStatus.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/orange/ddanzi/domain/product/enums/ItemStatus.java b/src/main/java/co/orange/ddanzi/domain/product/enums/ItemStatus.java index 628f7dd..72b8fa5 100644 --- a/src/main/java/co/orange/ddanzi/domain/product/enums/ItemStatus.java +++ b/src/main/java/co/orange/ddanzi/domain/product/enums/ItemStatus.java @@ -7,7 +7,8 @@ public enum ItemStatus { ON_SALE("판매중"), IN_TRANSACTION("거래중"), EXPIRED("만료됨"), - CLOSED("거래완료") + CLOSED("거래완료"), + DELETED("삭제됨") ; private final String itemStatus; From e2259a56f8296d010a8fba44c862e0f657e79b6f Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 8 Oct 2024 17:41:55 +0900 Subject: [PATCH 7/7] chore: add success msg --- src/main/java/co/orange/ddanzi/common/response/Success.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/orange/ddanzi/common/response/Success.java b/src/main/java/co/orange/ddanzi/common/response/Success.java index 5940f7e..8f66d16 100644 --- a/src/main/java/co/orange/ddanzi/common/response/Success.java +++ b/src/main/java/co/orange/ddanzi/common/response/Success.java @@ -52,8 +52,8 @@ public enum Success { DELETE_USER_SUCCESS(HttpStatus.OK, "Successfully deleted the user."), DELETE_INTEREST_SUCCESS(HttpStatus.OK, "Successfully removed the product from interest List."), DELETE_ADDRESS_SUCCESS(HttpStatus.OK, "Successfully deleted the delivery address."), - DELETE_ACCOUNT_SUCCESS(HttpStatus.OK, "Successfully deleted the account"), - + DELETE_ACCOUNT_SUCCESS(HttpStatus.OK, "Successfully deleted the account."), + DELETE_ITEM_SUCCESS(HttpStatus.OK, "Successfully deleted the item."), // 201 CREATED SIGNIN_KAKAO_SUCCESS(HttpStatus.CREATED, "Successfully sign in using Kakao"),