728x90
전 포스팅에 이어서, 상품 주문 로직을 설명하려고 한다.
주문상품, 주문정보, 총금액, 결제금액, 할인율 등을 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 id="orderInsert">
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>
<insert id="orderItemInsert">
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}
)
</insert>
주문테이블의 주문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 ,회원 테이블에서 회원의 적립금 감소
- 장바구니 초기화시켜주기
이다.
사용내역 부분의 설명은 생략하겠다.
다음 포스팅은 사용자가 확인 할 수 있는 주문목록이고,
그 다음은 관리자가 확인 할 수 있는 관리자 페이지의 주문관리를
포스팅해보려고 한다.
728x90
'SPRING > Homme Shop' 카테고리의 다른 글
[스프링] 쇼핑몰 - 주문관리 (0) | 2021.12.09 |
---|---|
[스프링] 쇼핑몰 - 주문목록 (0) | 2021.12.09 |
[스프링] 쇼핑몰 - 상품 주문 [ 1 ] (0) | 2021.12.08 |
[스프링] 쇼핑몰 - 비동기 장바구니 [3] (0) | 2021.12.08 |
[스프링] 쇼핑몰 - 비동기 장바구니 [2] (1) | 2021.12.08 |