fix(customer-vue): 주문내역 상세보기 로직 추가

- 주문내역 메뉴에서 상세보기 버튼 클릭 시 상세보기 페이지로 이동
This commit is contained in:
bum12ark
2022-03-22 17:33:15 +09:00
parent 7d5230adba
commit 9937e69580
6 changed files with 179 additions and 20 deletions

View File

@@ -24,5 +24,7 @@ export default {
getOrder() { getOrder() {
return axios.get(process.env.VUE_APP_ORDER_API_URL + "/order/orders"); return axios.get(process.env.VUE_APP_ORDER_API_URL + "/order/orders");
}, },
getOrderDetail(orderId) {
return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL + "/order-service/api/order-detail/" + orderId);
}
} }

View File

@@ -12,7 +12,7 @@
</div> </div>
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle class="mb-5"> <v-list-item-subtitle class="mb-5">
{{ card.orderStatus }} {{ card.orderStatus | getOrderStatusName }}
</v-list-item-subtitle> </v-list-item-subtitle>
<div class="text-body-1 mb-5"> <div class="text-body-1 mb-5">
{{ card.orderItemNames }} {{ card.orderItemNames }}
@@ -50,6 +50,7 @@ export default {
name: "OrderHistoryCard", name: "OrderHistoryCard",
props: { props: {
card: { card: {
orderId: String,
storeId: Number, storeId: Number,
storeName: String, storeName: String,
orderTime: String, orderTime: String,
@@ -66,7 +67,10 @@ export default {
}) })
}, },
clickDetail: function() { clickDetail: function() {
alert("준비 중입니다."); this.$router.push({
name: "order-detail",
params: {orderId: this.card.orderId}
});
} }
} }
} }

View File

@@ -19,10 +19,29 @@ axios.interceptors.request.use(function (config) {
config.headers.Authorization = "Bearer " + jwt.getToken(); config.headers.Authorization = "Bearer " + jwt.getToken();
return config; return config;
}); });
Vue.filter('currency', function (value) { Vue.filter('currency', function (value) {
var num = new Number(value); var num = new Number(value);
return num.toFixed(0).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,") return num.toFixed(0).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
}); });
Vue.filter('getOrderStatusName', function (orderStatus) {
switch (orderStatus) {
case "PLACED":
return "주문신청";
case "ACCEPTED":
return "주문수락";
case "REJECTED":
return "주문거절";
case "WAITING":
return "픽업대기";
case "FINISHED":
return "픽업완료";
case "FAILED":
return "주문실패";
default:
break;
}
});
axios.interceptors.response.use( axios.interceptors.response.use(
(response) => { (response) => {
@@ -43,6 +62,8 @@ axios.interceptors.response.use(
alert("권한이 없습니다. 다시 로그인 해주세요"); alert("권한이 없습니다. 다시 로그인 해주세요");
return Promise.reject(error2); return Promise.reject(error2);
} }
} else {
if (error.response.data.message) alert(error.response.data.message);
} }
return Promise.reject(error); return Promise.reject(error);
} }

View File

@@ -82,6 +82,13 @@ const routes = [
name: 'mypage', name: 'mypage',
component: () => import('../views/MyPage') component: () => import('../views/MyPage')
}, },
{
path: "/order-detail/:orderId",
beforeEnter: authCheck,
name: 'order-detail',
props: true,
component: () => import('../views/OrderDetail')
},
] ]
}, },
{ {

View File

@@ -0,0 +1,137 @@
<template>
<div>
<v-list-item three-line>
<v-list-item-content>
<v-list-item-title class="text-h5 mb-3">
{{ orderInfo.storeName }}
<div class="grey--text caption">
</div>
</v-list-item-title>
<v-list-item-subtitle class="mb-5">
{{ orderInfo.orderStatus | getOrderStatusName }}
</v-list-item-subtitle>
<div class="text-body-1 mb-5">
주문번호: {{ orderInfo.id }}
</div>
<div class="text--primary">
주문일시: {{ orderInfo.orderTime }}
</div>
</v-list-item-content>
</v-list-item>
<v-divider class="my-4"></v-divider>
<v-list-item two-line
v-for="order in orderItems" :key="order.id"
>
<v-list-item-content>
<v-list-item-title class="mb-2">
{{order.name}} {{order.count}}
</v-list-item-title>
<v-list-item-subtitle v-if="order.options.length > 0">
{{order.options}}
</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-list-item-action-text class="text-body-1">
{{order.totalPrice | currency}}
</v-list-item-action-text>
</v-list-item-action>
</v-list-item>
<v-divider class="my-4"></v-divider>
<v-simple-table class="no-border-table">
<template v-slot:default>
<tbody>
<tr>
<td><span class="orange--text"><b>합계</b></span></td>
<td class="text-right">{{orderInfo.orderPrice | currency}}</td>
</tr>
<tr>
<td>포인트사용</td>
<td class="text-right">0</td>
</tr>
<tr>
<td>쿠폰 할인</td>
<td class="text-right">0</td>
</tr>
<tr>
<td><span class="orange--text"><b>결제금액</b></span></td>
<td class="text-right"><b>{{orderInfo.orderPrice | currency}}</b></td>
</tr>
</tbody>
</template>
</v-simple-table>
</div>
</template>
<script>
import orderApi from "../api/order";
export default {
name: "OrderDetail",
props: ["orderId"],
data: function() {
return {
user: {},
orderInfo: {},
orderItems: []
};
},
mounted() {
this.search();
},
methods: {
search: async function() {
const response = await orderApi.getOrderDetail(this.orderId);
this.render(response.data);
},
render: function(json) {
const orderDetail = json.data;
const orderUser = orderDetail.user;
this.user = {
id: orderUser.id,
name: orderUser.name,
phoneNumber: orderUser.phoneNumber
};
this.orderInfo = {
id: orderDetail.id,
orderTime: orderDetail.orderTime,
orderPrice: orderDetail.orderPrice,
orderStatus: orderDetail.orderStatus,
storeName: orderDetail.storeName
};
const orderItems = orderDetail.orderItems;
orderItems.forEach(orderItem => {
let orderItemOptions = []
orderItem.options.forEach(option => {
const optionTypeName = option.optionType == "REQUIRED" ? "필수" : "기타";
orderItemOptions.push(option.name + "(" + optionTypeName + ")");
});
this.orderItems.push({
id: orderItem.id,
itemId: orderItem.itemId,
totalPrice: orderItem.totalPrice,
count: orderItem.count,
name: orderItem.name,
options: orderItemOptions.join(",")
});
});
}
}
}
</script>
<style scoped>
.no-border-table tbody tr td {
border-bottom: none !important;
}
</style>

View File

@@ -51,14 +51,10 @@ export default {
methods: { methods: {
search: async function() { search: async function() {
this.isLoading = true; this.isLoading = true;
try { this.page = 0;
this.page = 0; const response = await orderApi.requestOrderHistory(this.page);
const response = await orderApi.requestOrderHistory(this.page); this.cards = [];
this.cards = []; this.renderCard(response.data);
this.renderCard(response.data);
} catch (error) {
console.log(error);
}
this.isLoading = false; this.isLoading = false;
}, },
more: async function() { more: async function() {
@@ -85,19 +81,11 @@ export default {
storeId: order.storeId, storeId: order.storeId,
storeName: order.storeName, storeName: order.storeName,
orderPrice: order.orderPrice, orderPrice: order.orderPrice,
orderStatus: this.getOrderStatusName(order.orderStatus), orderStatus: order.orderStatus,
orderItemNames: this.getOrderItemName(order.orderItems) orderItemNames: this.getOrderItemName(order.orderItems)
}) })
}); });
}, },
getOrderStatusName(orderStatus) {
if (orderStatus === "PLACED") return "주문신청";
if (orderStatus === "REJECTED") return "주문거절";
if (orderStatus === "ACCEPTED") return "주문수락";
if (orderStatus === "WAITING") return "픽업대기";
if (orderStatus === "FINISHED") return "픽업완료";
return orderStatus;
},
getOrderItemName(orderItems) { getOrderItemName(orderItems) {
const itemSize = orderItems.length; const itemSize = orderItems.length;
if (itemSize == 1) return orderItems[0].orderItemName; if (itemSize == 1) return orderItems[0].orderItemName;