2021. 12. 17. 17:58ㆍ스프링부트
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 }
),
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의 아래 메서드는 필요없으니 삭제합니다
'스프링부트' 카테고리의 다른 글
스프링부트+jsp로 배달사이트 만들기-32 매출 관리 (0) | 2021.12.20 |
---|---|
스프링부트+jsp로 배달사이트 만들기-31 웹소켓으로 실시간 주문받기 (0) | 2021.12.17 |
스프링부트+jsp로 배달사이트 만들기-29 관리자페이지(메뉴 삭제,수정, 답장하기) (0) | 2021.12.17 |
스프링부트+jsp로 배달사이트 만들기-28 관리자페이지(가게 정보 수정, 메뉴 추가) (0) | 2021.12.17 |
스프링부트+jsp로 배달사이트 만들기-27 관리자 가게상세/AOP (1) | 2021.12.17 |