[스프링] 쇼핑몰 - 상품 주문 [ 2 ]

[스프링] 쇼핑몰 - 상품 주문 [ 2 ]

전 포스팅에 이어서, 상품 주문 로직을 설명하려고 한다.

주문상품, 주문정보, 총금액, 결제금액, 할인율 등을 insert 시켜서 주문서를 DB에 저장시킨다.

주문아이템VO

public class OrderItemInsertVO { private int[] Inorderitem_no; //주문아이템 pr private String[] Inorderitem_img; // private String[] Inorderitem_name; private String[] Inorderitem_option; private String[] Inorderitem_price; private int[] Inorderitem_item_no; private int[] Inorderitem_select_vol; private int orderitem_no; //주문아이템 pr private int orderitem_order_no; // 주문번호 private int orderitem_mem_no; private String orderitem_img; // private String orderitem_name; private String orderitem_option; private String orderitem_price; private int orderitem_item_no; private int orderitem_select_vol; //getter&setter; }

주문VO

public class OrderedVO { private int ordered_no; //PR private int ordered_mem_no; // 주문회원PR private String ordered_to_name; //주문자 private String ordered_to_tel; private String ordered_to_email; private String ordered_to_adr; private String ordered_to_post; private String ordered_from_name; //수취인 private String ordered_from_tel; private String ordered_from_adr; private String ordered_from_post; private int ordered_cartprice; //총액 private int ordered_orderprice; //결제금액 private String ordered_cpn_name; //쿠폰명 private int ordered_cpn_disc; //쿠폰할인액 private int ordered_usepoint; // 적립금사용액 private int ordered_payhow; //결제방식 private int ordered_paystate; //결제상태 1.일반 2.취소 3. 4.교환 private int ordered_delivstate; //배송상태 1.물품준비중 , 2.배송전, 3.배송완료 private String ordered_delivnum; //송장번호 private Date ordered_date; //주문일 private Date ordered_cdate; //주문취소일 getter&setter; }

먼저 주문상품이 들어갈 VO와 , 주문내역이 들어갈 VO다.

주문상품은 주문테이블에 주문상품 컬럼을 만들어서 콤마 [ , ] 를 기준으로

배열로 저장되게 하여 상품의 PR을 넣어서 select하여 구성할 수도 있겠지만..

시간적 여유의 부족과, join을 남발하지 못 할 상황 때문에 이렇게 통으로 정보를 insert 시키게 됐다.

Mapper

INSERT INTO ORDERED (ORDERED_NO , ORDERED_TO_NAME , ORDERED_TO_TEL , ORDERED_TO_EMAIL , ORDERED_TO_ADR, ORDERED_TO_POST ,ORDERED_FROM_NAME, ORDERED_FROM_TEL , ORDERED_FROM_ADR , ORDERED_FROM_POST ,ORDERED_CARTPRICE , ORDERED_ORDERPRICE , ORDERED_CPN_NAME , ORDERED_CPN_DISC , ORDERED_USEPOINT , ORDERED_PAYHOW , ORDERED_MEM_NO ) VALUES( #{ordered_no} , #{ordered_to_name} , #{ordered_to_tel} , #{ordered_to_email} , #{ordered_to_adr} , #{ordered_to_post} , #{ordered_from_name} , #{ordered_from_tel} , #{ordered_from_adr} , #{ordered_from_post} , #{ordered_cartprice} , #{ordered_orderprice} , #{ordered_cpn_name} , #{ordered_cpn_disc} , #{ordered_usepoint} , #{ordered_payhow} , #{ordered_mem_no} ) INSERT INTO ORDERITEM ( ORDERITEM_NO, ORDERITEM_IMG , ORDERITEM_NAME ,ORDERITEM_OPTION ,ORDERITEM_PRICE , ORDERITEM_ITEM_NO, ORDERITEM_SELECT_VOL ,ORDERITEM_ORDER_NO,ORDERITEM_MEM_NO) VALUES( (SELECT NVL(MAX(ORDERITEM_NO), 0) + 1 FROM ORDERITEM) , #{orderitem_img} , #{orderitem_name} , #{orderitem_option} , #{orderitem_price} , #{orderitem_item_no} , #{orderitem_select_vol} , #{orderitem_order_no} , #{orderitem_mem_no} )

주문테이블의 주문PR인 [ordered_no]은 난수값 8자리를 넣어줬다.

Controller

@RequestMapping(value="/orderInsert", method=RequestMethod.POST) public String orderInsert(OrderedVO orderedVO, OrderItemInsertVO itemInsertVO)throws Exception{ logger.info("orderVOtest="+merchant_uid); String ckid = RandomStringUtils.randomNumeric(8); int orderedNo = Integer.parseInt(ckid); orderedVO.setOrdered_no(orderedNo); mainService.orderInsert(orderedVO, itemInsertVO); return "redirect:/main/cartView"; }

숫자난수 8자리를 생성해주고 VO에 넣어준다음, 주문페이지에서 받은 파라미터를 서비스로 전달해준다.

Service

@Transactional public void orderInsert(OrderedVO orderedVO, OrderItemInsertVO itemInsertVO)throws Exception{ mainDAO.orderInsert(orderedVO); int orderNo = orderedVO.getOrdered_no(); itemInsertVO.setOrderitem_order_no(orderNo); itemInsertVO.setOrderitem_mem_no(orderedVO.getOrdered_mem_no()); for(int i =0; i < (itemInsertVO.getInorderitem_name()).length; i++) { itemInsertVO.setOrderitem_img(itemInsertVO.getInorderitem_img()[i]); itemInsertVO.setOrderitem_name(itemInsertVO.getInorderitem_name()[i]); itemInsertVO.setOrderitem_option(itemInsertVO.getInorderitem_option()[i]); itemInsertVO.setOrderitem_price(itemInsertVO.getInorderitem_price()[i]); itemInsertVO.setOrderitem_item_no(itemInsertVO.getInorderitem_item_no()[i]); itemInsertVO.setOrderitem_select_vol(itemInsertVO.getInorderitem_select_vol()[i]); mainDAO.orderItemInsert(itemInsertVO); //상품 옵션 개수 감소 mainDAO.itemVolDelete(itemInsertVO.getOrderitem_select_vol(), itemInsertVO.getOrderitem_item_no()); } //쿠폰 사용시 사용내역 , 쿠폰삭제 if(orderedVO.getOrdered_cpn_disc() != 0) { String history_content = "쿠폰 :[ "+orderedVO.getOrdered_cpn_name() + "]을 사용하셨습니다"; int history_mem_no = orderedVO.getOrdered_mem_no(); mainDAO.historyInsert(history_content, history_mem_no); mainDAO.couponDelete(orderedVO.getOrdered_cpn_name(), orderedVO.getOrdered_mem_no()); } //적립금 사용시 사용내역, 적립금 감소 if(orderedVO.getOrdered_usepoint() != 0) { String history_content = "적립금 : ["+orderedVO.getOrdered_usepoint() + "원]을 사용하셨습니다"; int history_mem_no = orderedVO.getOrdered_mem_no(); mainDAO.historyInsert(history_content, history_mem_no); mainDAO.pointDelete(orderedVO.getOrdered_usepoint(), orderedVO.getOrdered_mem_no()); } //장바구니 초기화 mainDAO.cartReset(orderedVO.getOrdered_mem_no()); }

로직은

주문insert - 주문상품insert - 주문상품의 옵션 개수를 주문한 수량만큼 감소

- 쿠폰 사용내역 insert , 회원의 쿠폰 삭제

- 적립금 사용내역 insert ,회원 테이블에서 회원의 적립금 감소

- 장바구니 초기화시켜주기

이다.

사용내역 부분의 설명은 생략하겠다.

다음 포스팅은 사용자가 확인 할 수 있는 주문목록이고,

그 다음은 관리자가 확인 할 수 있는 관리자 페이지의 주문관리를

포스팅해보려고 한다.

from http://kimfk567.tistory.com/92 by ccl(A) rewrite - 2021-12-09 01:06:30