SPRING/Homme Shop

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

간펴니 2021. 12. 9. 00:45
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