쇼핑몰 프로젝트

쇼핑몰 프로젝트 추가 수정 ( 업데이트 )

Sunho314 2024. 8. 22. 14:56

쇼핑몰 프로젝트를 마무리하고 정말 번듯한 홈페이지로 만들어보고자하는

생각이들어 꾸준하게 업데이트를 하게 되었습니다.

 

MypageUser 페이지를 추가하였습니다.

user의 정보들을 확인할 수 있고,
해당 user 가 보유하고 있는 coupons 와 reviews 를 확인할 수 있습니다.

userUpdate 버튼은 추후 수정 예정입니다.

 

 

원래는 productUpdate 였던 상품수정 페이지를
관리자 페이지로 묶었으며
상품수정, 등록
쿠폰수정, 등록
환불을 신청한 사람들의 환불을 승인해주는 페이지를 추가했습니다.

 

 

쿠폰생성페이지입니다.
coupon 테이블을 추가했으며 현재는 일정한 최소금액을 넘고

정해진 기간 안에 사용하게 되면

할인을 해주는 coupon을 생성할 수 있습니다.

 

쿠폰수정 페이지입니다.

 

쿠폰의 정보들을 나열하며 Specification 을 이용하여 검색이 가능하고 아래는 java Code 입니다.

@GetMapping("/couponSearch")
    public List<Coupon> searchCoupons(
            @RequestParam(value = "couponCode",required = false) Long couponCode,
            @RequestParam(value = "serialCode",required = false) String serialCode,
            @RequestParam(value = "discountAmount",required = false) Integer discountAmount,
            @RequestParam(value = "issueDate",required = false) LocalDate issueDate,
            @RequestParam(value = "expiryDate",required = false) LocalDate expiryDate,
            @RequestParam(value = "minPurchaseAmount",required = false) Integer minPurchaseAmount,
            @RequestParam(value = "used",required = false) Boolean used) {
        return couponService.searchCoupons(couponCode, serialCode, discountAmount, issueDate, expiryDate, minPurchaseAmount, used);
    }
    
////////

@Transactional(readOnly = true)
    public List<Coupon> searchCoupons(Long couponCode, String serialCode, Integer discountAmount, LocalDate issueDate,
                                      LocalDate expiryDate, Integer minPurchaseAmount, Boolean used) {
        Specification<Coupon> spec = Specification.where(null);

        if (couponCode != null) {
            spec = spec.and(CouponSpecifications.hasCouponCode(couponCode));
        }
        if (serialCode != null) {
            spec = spec.and(CouponSpecifications.hasSerialCode(serialCode));
        }
        if (discountAmount != null) {
            spec = spec.and(CouponSpecifications.hasDiscountAmount(discountAmount));
        }
        if (issueDate != null) {
            spec = spec.and(CouponSpecifications.hasIssueDate(issueDate));
        }
        if (expiryDate != null) {
            spec = spec.and(CouponSpecifications.hasExpiryDate(expiryDate));
        }
        if (minPurchaseAmount != null) {
            spec = spec.and(CouponSpecifications.hasMinPurchaseAmount(minPurchaseAmount));
        }
        if (used != null) {
            spec = spec.and(CouponSpecifications.isUsed(used));
        }

        return couponRepository.findAll(spec);
    }

///////

package Search;

import org.springframework.data.jpa.domain.Specification;

import com.example.estate.entity.Coupon;

import java.time.LocalDate;

public class CouponSpecifications {

    public static Specification<Coupon> hasCouponCode(Long couponCode) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("couponCode"), couponCode);
    }

    public static Specification<Coupon> hasSerialCode(String serialCode) {
        return (coupon, cq, cb) -> cb.like(cb.lower(coupon.get("serialCode")), "%" + serialCode.toLowerCase() + "%");
    }

    public static Specification<Coupon> hasDiscountAmount(Integer discountAmount) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("discountAmount"), discountAmount);
    }

    public static Specification<Coupon> hasIssueDate(LocalDate issueDate) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("issueDate"), issueDate);
    }

    public static Specification<Coupon> hasExpiryDate(LocalDate expiryDate) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("expiryDate"), expiryDate);
    }

    public static Specification<Coupon> hasMinPurchaseAmount(Integer minPurchaseAmount) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("minPurchaseAmount"), minPurchaseAmount);
    }

    public static Specification<Coupon> isUsed(Boolean used) {
        return (coupon, cq, cb) -> cb.equal(coupon.get("used"), used);
    }
}

 

edit 버튼을 누르면 TextInput 칸이 출력되며 칸 안에 넣은 값을 DB에 저장합니다.

 

 

다음으로는 환불승인 페이지입니다.
Edit 버튼을 누르면 쿠폰수정 페이지와 동일하게 TextInput 칸이 출력되며 DB값을 수정할 수 있습니다.
Approve 버튼을 누르면 해당 Orders 테이블의 RefundState(환불상태)가 환급진행중으로 수정되며

결제 API인 Import에서 환불처리를 진행하며 RefundState가 "환급완료"로 수정됩니다.

 

아래는 환불을 진행하는 Java Code 입니다.

@PostMapping("/cancelIamport/{imp_uid}")
    public IamportResponse<Payment> cancelPaymentByImpUid(
        @PathVariable("imp_uid") String imp_uid,
        @RequestBody Map<String, Long> requestData
    ) throws IamportResponseException, IOException {
        IamportClient iamportClient = iamportClient(); // iamportClient 빈을 직접 사용
        CancelData cancelData = new CancelData(imp_uid, true); // imp_uid를 이용한 전액 취소
        IamportResponse<Payment> response = iamportClient.cancelPaymentByImpUid(cancelData);

        if (response.getCode() == 0) {
            // 결제 취소 성공 시 로직 추가 (예: 재고 복구, 주문 상태 업데이트 등)
            Payment payment = response.getResponse();
            Long productCode = requestData.get("productCode"); // 프론트에서 받은 productCode
            Long orderCode = requestData.get("orderCode"); // 프론트에서 받은 userCode

            // 상품 재고 복구
            Product product = productRepository.findByProductCode(productCode);
            if (product != null) {
                product.setProductStuck(product.getProductStuck() + 1);
                productRepository.save(product);
            }

            // 주문 상태 업데이트
            Orders order = ordersRepository.findByOrderCode(orderCode);
            if (order != null) {
            	order.setRefundState("환급 완료");
                order.setRefundState("환급 완료");
                ordersRepository.save(order);
            }
        }

        return response;
    }

 

Mypag 에 환불신청 칸이 추가되었습니다.
처음에는 "환불 신청"으로 출력되며 환불 신청을 클릭하면
"승인 대기중" 으로 Update 되며 환불승인 페이지에서 관리할 수 있습니다.