스프링부트+jsp로 배달사이트 만들기-30 주문접수

2021. 12. 17. 17:58스프링부트

 

주문접수.zip
0.01MB

 

header.jsp 메뉴부분의 매장관리를 삭제하고 url을 수정합니다 

 

 

 

 

 

 

주문접수 페이지 메서드를 추가합니다

@IsMyStore
@GetMapping("/admin/management/order/{id}")
public String order(@PathVariable long id) {
	return "admin/order";
}

 

주문접수 페이지로 이동합니다

 

 

 

주문접수 페이지에서 주문목록을 불러올 메서드를 추가합니다

@IsMyStore
@GetMapping("/admin/management/orderList")
public ResponseEntity<Map<String, Object>> orderList(long storeId, String list, int page) {

	System.out.println(storeId);
	System.out.println(list);
	System.out.println("page = " + page);
	List<OrderList> orderList = adminService.order(storeId, list, page);
	
	Map<String, Object> map = new HashMap<>();
	List<List<Cart>> menuList = new ArrayList<>();
	System.out.println(orderList);
	if(orderList.size() != 0 && orderList.get(0).getFoodInfo() != null) {
		for (int i=0;i<orderList.size();i++) {
			menuList.add(FoodInfoFromJson.foodInfoFromJson(orderList.get(i).getFoodInfo()));
		}
	}
	
	map.put("orderList", orderList);
	map.put("cartList", menuList);
	return new ResponseEntity<Map<String, Object>>(map, HttpStatus.OK);
}

가게id, 출력하고 싶은 목록(접수 대기중 목록, 처리 중 목록), 페이지를 받아서 주문목록을 SELECT 합니다

주문목록에 담긴 JSON형태의 메뉴 정보를 uil패키지에 만들었던 메서드로 객체로 변환후 리스트에 담습니다

 

AdminServiceImp

@Override
public List<OrderList> order(long storeId, String list, int page) {
	Page p = new Page(page);
	
	Map<String, Object> map = new HashMap<>();
	
	map.put("storeId", storeId);
	map.put("list", list);
	map.put("firstList", p.getFirstList());
	map.put("lastList", p.getLastList());
	
	return adminDAO.order(map);
}

 

AdminDAOImp

@Override
public List<OrderList> order(Map<String, Object> map) {
	return sql.selectList("admin.orderList", map);
}

 

AdminMapper

<select id="orderList" resultType="OrderList">
	WITH T_ORDER AS ( 
	    SELECT * FROM (
	    	SELECT * FROM BM_ORDER_USER UNION ALL SELECT * FROM BM_ORDER_NON_USER) WHERE STORE_ID = #{storeId }
	),
	T_DETAIL AS (
	    SELECT  ORDER_NUM, 
	            LISTAGG(FOOD_INFO, '/') FOOD_INFO
	    FROM BM_ORDER_DETAIL_USER N
	    GROUP BY    ORDER_NUM
	    UNION ALL
	    SELECT  ORDER_NUM, 
	            LISTAGG(FOOD_INFO, '/') FOOD_INFO
	    FROM BM_ORDER_DETAIL_NON_USER N
	    GROUP BY    ORDER_NUM
	)
	 SELECT   COUNT1
              ,COUNT2
              ,O.*
              ,D.FOOD_INFO
              ,S.STORE_NAME
              ,S.DELEVERY_TIP
      FROM (
          SELECT  #{storeId } AS STORE_ID
                          ,A.COUNT COUNT1
                          ,B.COUNT COUNT2
                  FROM    (SELECT COUNT(*) COUNT FROM T_ORDER WHERE DELEVERY_STATUS = '주문접수 대기 중') A,
                          (SELECT COUNT(*) COUNT FROM T_ORDER WHERE DELEVERY_STATUS LIKE '배달 준비 중%') B
      ) ORDER_COUNT
      LEFT JOIN
      (SELECT * FROM
          (SELECT ROWNUM RN, T.* FROM (
              SELECT * FROM T_ORDER WHERE DELEVERY_STATUS LIKE '${list }%' ORDER BY ORDER_DATE) T ) 
       WHERE RN BETWEEN #{firstList } AND #{lastList }
       )O       
      ON          ORDER_COUNT.STORE_ID = O.STORE_ID
      LEFT JOIN   T_DETAIL D      
      ON          O.ORDER_NUM  = D.ORDER_NUM
      LEFT JOIN   BM_STORE S
      ON          O.STORE_ID = S.ID
      ORDER BY ORDER_DATE
</select>

주문대기 목록 수, 배달준비 목록 수,  가게정보, 주문정보를 한번에 가져오려다 보니 코드가 지저분해진거 같습니다

 

WITH T_ORDER AS ( 
	SELECT * FROM (
		SELECT * FROM BM_ORDER_USER UNION ALL SELECT * FROM BM_ORDER_NON_USER) WHERE STORE_ID = #{storeId }
),
BM_ORDER_USER와 BM_ORDER_NON_USER를 UNION ALL 결과를  T_ORDER에 저장합니다
 
 
T_DETAIL AS (
	SELECT  ORDER_NUM, 
			LISTAGG(FOOD_INFO, '/') FOOD_INFO
	FROM BM_ORDER_DETAIL_USER N
	GROUP BY    ORDER_NUM
	UNION ALL
	SELECT  ORDER_NUM, 
			LISTAGG(FOOD_INFO, '/') FOOD_INFO
	FROM BM_ORDER_DETAIL_NON_USER N
	GROUP BY    ORDER_NUM
)

DETAIL테이블의 메뉴정보를 LISTAGG를 사용해 하나의 컬럼으로 변환후 UNION ALL하고 T_DETAIL에 저장합니다

 

(
SELECT  #{storeId } AS STORE_ID
		,A.COUNT COUNT1
		,B.COUNT COUNT2
FROM    (SELECT COUNT(*) COUNT FROM T_ORDER WHERE DELEVERY_STATUS = '주문접수 대기 중') A,
		(SELECT COUNT(*) COUNT FROM T_ORDER WHERE DELEVERY_STATUS LIKE '배달 준비 중%') B
) ORDER_COUNT

위에서 저장한 T_ORDER에서 전체 접수 대기 수와 배달 준비 수를 구하고 파라미터로 넘어온 STOREID를 같이 출력합니다

 

(SELECT * FROM
(SELECT ROWNUM RN, T.* FROM (
	SELECT * FROM T_ORDER WHERE DELEVERY_STATUS LIKE '${list }%' ORDER BY ORDER_DATE) T ) 
WHERE RN BETWEEN #{firstList } AND #{lastList }
)O

페이징을 위해 ROWNUM을 구하고 한번더 SELECT로 감쌌습니다

 

 

 

 

주문접수 처리를 하기 위해 컨트롤러에 메서드를 추가합니다

@PatchMapping("/admin/management/orderAccept")
public ResponseEntity<String> orderAccept(String orderNum, int time, long userId) {
//		userId == 0 비회원
	adminService.orderAccept(orderNum, time, userId);
	
	return new ResponseEntity<>(HttpStatus.OK);
}

주문번호와 배달시간, 주문자ID만 받아서 UPDATE하는 간단한 메서드입니다

 

AdminServiceImp

@Override
public void orderAccept(String orderNum, int time,long userId) {
	adminDAO.orderAccept(orderNum, time,userId);
}

 

 

AdminDAOImp

@Override
public void orderAccept(String orderNum, int time, long userId) {
	Map<String, Object> map = new HashMap<>();
	map.put("orderNum", orderNum);
	map.put("time", time);
	map.put("userId", userId);
	sql.update("admin.orderAccept", map);
}

 

AdminMapper

<update id="orderAccept">
	<if test="userId == 0">
		UPDATE BM_ORDER_NON_USER SET
	</if>
	<if test="userId != 0">
		UPDATE BM_ORDER_USER SET
	</if>
		DELEVERY_STATUS = '배달 준비 중(약 ${time}분 후에 도착)'
		WHERE ORDER_NUM = #{orderNum }
</update>

 

 

 

 

 

주문 거부 메서드를 추가합니다

@PatchMapping("/admin/management/orderCancle")
public ResponseEntity<String> orderCancle(OrderCancle orderCancle) {
	adminService.orderCancle(orderCancle);
	return new ResponseEntity<>(HttpStatus.OK);
}

 

주문거부 정보를 담을 dto를 추가합니다

OrderCancle

@Getter
@Setter
@ToString
public class OrderCancle {

	private String OrderNum;
	private String cancleReason;
	private long userId;
	private int totaloPrice;
	private int usedPoint;
	private int deleveryTip;
	
	private String impUid; // 아임포트 결제번호
}

결제 api 사용시 필요한 정보를 미리 추가하였습니다

 

service와 dao를 추가합니다

AdminServiceImp

	@Override
	public void orderCancle(OrderCancle orderCancle) {
		adminDAO.orderCancle(orderCancle);
	}

 

AdminDAOImp

@Override
public void orderCancle(OrderCancle orderCancle) {
	sql.update("admin.orderCancle", orderCancle);
}

 

 

AdminMapper

<update id="orderCancle">
	<if test="userId == 0">
		UPDATE BM_ORDER_NON_USER SET 
	</if>
	<if test="userId != 0">
		UPDATE BM_ORDER_USER SET
	</if>
		DELEVERY_STATUS = '주문 취소(${cancleReason })'
		WHERE ORDER_NUM = #{orderNum }
</update>

 

 

 

 

 

주문 완료 메서드를 추가합니다

@PatchMapping("/admin/management/orderComplete")
public ResponseEntity<String> orderComplete(String orderNum, long userId) {
//		userId == 0 비회원
	adminService.orderComplete(orderNum, userId);
	return new ResponseEntity<>(HttpStatus.OK);
}

 

AdminServiceImp

@Override
public void orderComplete(String orderNum, long userId) {
	Map<String, Object> map = new HashMap<>();
	map.put("orderNum", orderNum);
	map.put("userId", userId);
	adminDAO.orderComplete(map);
}

 

AdminDAOImp

	@Override
	public void orderComplete(Map<String, Object> map) {
		sql.update("admin.orderComplete", map);
	}

 

AdminMapper

<update id="orderComplete">
	<if test="userId == 0">
		UPDATE BM_ORDER_NON_USER SET 
	</if>
	<if test="userId != 0">
		UPDATE BM_ORDER_USER SET
	</if>
		DELEVERY_STATUS = '배달 완료'
		WHERE ORDER_NUM = #{orderNum }
</update>

 

 

 


adminOrder.js의 아래 메서드는 필요없으니 삭제합니다