You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
512 lines
14 KiB
512 lines
14 KiB
<template>
|
|
<div class="bg">
|
|
<el-tabs v-model="activeTab">
|
|
<el-tab-pane label="待评价订单" name="pendingPayment"></el-tab-pane>
|
|
<el-tab-pane label="已评价" name="pendingDelivery"></el-tab-pane>
|
|
</el-tabs>
|
|
|
|
<div class="filter-bar">
|
|
<el-form :inline="true" :model="filterForm" size="small">
|
|
|
|
<el-form-item label="订单编号">
|
|
<el-input v-model="filterForm.orderNo" placeholder="请输入订单编号"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="商品名称">
|
|
<el-input v-model="filterForm.goodsName" placeholder="请输入商品名称"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="供应商名称">
|
|
<el-input v-model="filterForm.merchantName" placeholder="请输入商家名称"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="下单时间">
|
|
<el-date-picker v-model="filterForm.createTime" type="daterange" range-separator="至" start-placeholder="开始日期"
|
|
end-placeholder="结束日期" value-format="yyyy-MM-dd"></el-date-picker>
|
|
</el-form-item>
|
|
|
|
<el-form-item>
|
|
<el-button style="background:#6a8a27;border: none;" type="primary" @click="search">搜索</el-button>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button @click="reset">重置</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div>
|
|
|
|
<div>
|
|
<div class="order-products" style="padding:0 20px;background: #f8f9fa; border-top: 1px solid #eee; border-bottom: 1px solid #eee;margin-bottom: 20px;">
|
|
<div class="product-item" >
|
|
<div class="product-details">
|
|
<div class="product-name">商品信息</div>
|
|
</div>
|
|
<div class="product-price">单价(元)</div>
|
|
<div class="product-quantity">数量</div>
|
|
<div class="product-total">小计(元)</div>
|
|
<!-- <div class="product-status">
|
|
<el-tag :type="getStatusTagType(product.status)" size="small">{{ getStatusText(product.status) }}</el-tag>
|
|
</div> -->
|
|
<div class="product-actions"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 订单卡片 - 按商家合并商品 -->
|
|
<div class="order-card" v-for="order in filteredOrders" :key="order.id">
|
|
<!-- 订单头部 - 包含商家信息 -->
|
|
<div class="order-header flex-between">
|
|
<div style="display: flex;">
|
|
<div >订单号: {{ order.orderNo }}</div>
|
|
<div style="padding-left: 60px;">下单时间:{{ order.createTime }}</div>
|
|
</div>
|
|
<div class="product-status">
|
|
<!-- <el-tag :type="getStatusTagType(order.status)" size="small">{{ getStatusText(order.status) }}</el-tag> -->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 订单商品列表 -->
|
|
<div class="order-products">
|
|
<div class="product-item" v-for="product in order.products" :key="product.id">
|
|
<img :src="product.image" class="product-image" :alt="product.name">
|
|
<div class="product-details">
|
|
<div class="product-name">{{ product.name }}</div>
|
|
<div class="product-spec">{{ product.spec }}</div>
|
|
</div>
|
|
<div class="product-price">¥{{ product.price.toFixed(2) }}</div>
|
|
<div class="product-quantity">x{{ product.quantity }}</div>
|
|
<div class="product-total">¥{{ (product.price * product.quantity).toFixed(2) }}</div>
|
|
<!-- <div class="product-status">
|
|
<el-tag :type="getStatusTagType(product.status)" size="small">{{ getStatusText(product.status) }}</el-tag>
|
|
</div> -->
|
|
<div class="product-actions">
|
|
<el-button type="text" size="mini"> 商品详情</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 订单底部 - 金额和操作 -->
|
|
<div class="order-footer">
|
|
<div class="order-summary">
|
|
<div class="order-amount">
|
|
合计: <strong>¥{{ order.totalAmount.toFixed(2) }}</strong> (含运费 ¥{{ order.freight.toFixed(2) }})
|
|
</div>
|
|
<!-- <div class="order-tips">
|
|
{{ order.products.length }}件商品
|
|
</div> -->
|
|
</div>
|
|
<div class="order-actions">
|
|
<el-button type="text" size="mini" @click="gotoReview(order.id)">去评价</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<el-empty description="暂无订单" v-if="filteredOrders.length<=0"></el-empty>
|
|
|
|
<!-- 分页 -->
|
|
<div style="text-align: right; margin-top: 20px;">
|
|
<el-pagination
|
|
@size-change="handleSizeChange"
|
|
@current-change="handleCurrentChange"
|
|
:current-page="currentPage"
|
|
:page-sizes="[5, 10, 20]"
|
|
:page-size="pageSize"
|
|
layout="total, sizes, prev, pager, next, jumper"
|
|
:total="filteredOrders.length"
|
|
></el-pagination>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'OrderList',
|
|
data () {
|
|
return {
|
|
activeTab: 'all',
|
|
currentPage: 1,
|
|
pageSize: 10,
|
|
filterForm: {
|
|
goodsName: '',
|
|
orderNo: '',
|
|
createTime: '',
|
|
merchantName: '',
|
|
tradeStatus: ''
|
|
},
|
|
// 订单数据 - 按商家合并商品
|
|
orders: [
|
|
{
|
|
id: 1,
|
|
orderNo: '209907091214560078',
|
|
createTime: '2099-07-09 10:47:49',
|
|
status: 'pendingPayment',
|
|
totalAmount: 937,
|
|
freight: 15,
|
|
isReviewed: false,
|
|
merchant: {
|
|
id: 101,
|
|
name: '花艺生活馆',
|
|
isOfficial: true
|
|
},
|
|
products: [
|
|
{
|
|
id: 1001,
|
|
name: '深情挚爱/卡罗拉玫瑰',
|
|
image: 'https://picsum.photos/200/200?random=1',
|
|
spec: '卡罗拉玫瑰33枝',
|
|
price: 349,
|
|
quantity: 1,
|
|
status: 'pendingPayment'
|
|
},
|
|
{
|
|
id: 1002,
|
|
name: '精美包装纸',
|
|
image: 'https://picsum.photos/200/200?random=4',
|
|
spec: '粉色',
|
|
price: 38,
|
|
quantity: 2,
|
|
status: 'pendingPayment'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 2,
|
|
orderNo: '209907091214560079',
|
|
createTime: '2099-07-09 10:48:49',
|
|
status: 'pendingDelivery',
|
|
totalAmount: 199,
|
|
freight: 0,
|
|
isReviewed: false,
|
|
merchant: {
|
|
id: 102,
|
|
name: '北欧家居旗舰店',
|
|
isOfficial: true
|
|
},
|
|
products: [
|
|
{
|
|
id: 2001,
|
|
name: '北欧花艺素雅仿真花',
|
|
image: 'https://picsum.photos/200/200?random=2',
|
|
spec: '白色',
|
|
price: 199,
|
|
quantity: 1,
|
|
status: 'pendingDelivery'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 3,
|
|
orderNo: '209907091214560080',
|
|
createTime: '2099-07-09 10:49:49',
|
|
status: 'delivering',
|
|
totalAmount: 389,
|
|
freight: 10,
|
|
isReviewed: false,
|
|
merchant: {
|
|
id: 101,
|
|
name: '花艺生活馆',
|
|
isOfficial: true
|
|
},
|
|
products: [
|
|
{
|
|
id: 3001,
|
|
name: '香槟玫瑰+白玫瑰混搭',
|
|
image: 'https://picsum.photos/200/200?random=3',
|
|
spec: '混搭',
|
|
price: 389,
|
|
quantity: 1,
|
|
status: 'delivering'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
computed: {
|
|
// 过滤后的订单列表
|
|
filteredOrders() {
|
|
let result = [...this.orders];
|
|
|
|
// 根据当前标签页过滤
|
|
if (this.activeTab !== 'all') {
|
|
result = result.filter(order => order.status === this.activeTab);
|
|
}
|
|
|
|
// 根据商品名称过滤
|
|
if (this.filterForm.goodsName) {
|
|
const keyword = this.filterForm.goodsName.toLowerCase();
|
|
result = result.filter(order => {
|
|
return order.products.some(product =>
|
|
product.name.toLowerCase().includes(keyword)
|
|
);
|
|
});
|
|
}
|
|
|
|
// 根据订单编号过滤
|
|
if (this.filterForm.orderNo) {
|
|
result = result.filter(order =>
|
|
order.orderNo.includes(this.filterForm.orderNo)
|
|
);
|
|
}
|
|
|
|
// 根据商家名称过滤
|
|
if (this.filterForm.merchantName) {
|
|
const keyword = this.filterForm.merchantName.toLowerCase();
|
|
result = result.filter(order =>
|
|
order.merchant.name.toLowerCase().includes(keyword)
|
|
);
|
|
}
|
|
|
|
// 根据交易状态过滤
|
|
if (this.filterForm.tradeStatus) {
|
|
result = result.filter(order =>
|
|
order.status === this.filterForm.tradeStatus
|
|
);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
},
|
|
methods: {
|
|
// 搜索
|
|
search() {
|
|
this.currentPage = 1; // 重置到第一页
|
|
this.$message({
|
|
message: '搜索条件已应用',
|
|
type: 'info'
|
|
});
|
|
},
|
|
|
|
// 重置
|
|
reset() {
|
|
this.filterForm = {
|
|
goodsName: '',
|
|
orderNo: '',
|
|
createTime: '',
|
|
merchantName: '',
|
|
tradeStatus: ''
|
|
};
|
|
this.activeTab = 'all';
|
|
this.currentPage = 1;
|
|
},
|
|
|
|
// 分页大小改变
|
|
handleSizeChange(val) {
|
|
this.pageSize = val;
|
|
},
|
|
|
|
// 当前页改变
|
|
handleCurrentChange(val) {
|
|
this.currentPage = val;
|
|
},
|
|
|
|
// 获取状态显示文本
|
|
getStatusText(status) {
|
|
const statusMap = {
|
|
pendingPayment: '待付款',
|
|
pendingDelivery: '待发货',
|
|
delivering: '配送中',
|
|
completed: '已完成',
|
|
cancelled: '已取消'
|
|
};
|
|
return statusMap[status] || status;
|
|
},
|
|
|
|
// 获取状态标签类型
|
|
getStatusTagType(status) {
|
|
const typeMap = {
|
|
pendingPayment: 'warning',
|
|
pendingDelivery: 'info',
|
|
delivering: 'primary',
|
|
completed: 'success',
|
|
cancelled: 'danger'
|
|
};
|
|
return typeMap[status] || 'default';
|
|
},
|
|
|
|
// 去付款
|
|
payOrder(orderId) {
|
|
this.$message({
|
|
message: `订单 ${orderId} 去付款`,
|
|
type: 'info'
|
|
});
|
|
},
|
|
|
|
// 提醒发货
|
|
remindDelivery(orderId) {
|
|
this.$message({
|
|
message: `已提醒订单 ${orderId} 发货`,
|
|
type: 'success'
|
|
});
|
|
},
|
|
|
|
// 查看物流
|
|
checkLogistics(orderId) {
|
|
this.$message({
|
|
message: `查看订单 ${orderId} 物流`,
|
|
type: 'info'
|
|
});
|
|
},
|
|
|
|
// 去评价
|
|
gotoReview(orderId) {
|
|
this.$message({
|
|
message: `去评价订单 ${orderId}`,
|
|
type: 'info'
|
|
});
|
|
},
|
|
|
|
// 查看订单详情
|
|
viewOrderDetail(orderId) {
|
|
this.$router.push({
|
|
name: 'OrderDetail',
|
|
});
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.bg{
|
|
display: flex;
|
|
flex-direction: column;
|
|
|
|
::v-deep .el-button--text {
|
|
color: #6a8a27;
|
|
}
|
|
::v-deep .el-tabs__item.is-active{
|
|
color: #6a8a27;
|
|
}
|
|
::v-deep .el-tabs__active-bar{
|
|
background-color: #6a8a27
|
|
}
|
|
::v-deep .el-tabs__item:hover{
|
|
color: #6a8a27;
|
|
}
|
|
}
|
|
.filter-bar {
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
|
|
/* 订单卡片样式 */
|
|
.order-card {
|
|
border: 1px solid #eee;
|
|
border-radius: 4px;
|
|
margin-bottom: 20px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* 订单头部 - 包含商家信息 */
|
|
.order-header {
|
|
background-color: #f8f9fa;
|
|
padding: 12px 20px;
|
|
display: flex;
|
|
align-items: center;
|
|
border-bottom: 1px solid #eee;
|
|
color: #666;
|
|
font-size: 14px;
|
|
}
|
|
|
|
|
|
|
|
/* 订单商品列表 */
|
|
.order-products {
|
|
padding: 10px 20px;
|
|
}
|
|
|
|
.product-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 15px 0;
|
|
border-bottom: 1px dashed #eee;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.product-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.product-image {
|
|
width: 80px;
|
|
height: 80px;
|
|
object-fit: cover;
|
|
margin-right: 15px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.product-details {
|
|
flex: 1;
|
|
}
|
|
|
|
.product-name {
|
|
color: #333;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.product-spec {
|
|
color: #999;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.product-price {
|
|
width: 120px;
|
|
text-align: center;
|
|
color: #333;
|
|
}
|
|
|
|
.product-quantity {
|
|
width: 100px;
|
|
text-align: center;
|
|
color: #666;
|
|
}
|
|
|
|
.product-total {
|
|
width: 120px;
|
|
text-align: center;
|
|
color: #333;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.product-status {
|
|
width: 150px;
|
|
text-align: center;
|
|
}
|
|
|
|
.product-actions {
|
|
width: 150px;
|
|
text-align: center;
|
|
}
|
|
|
|
/* 订单底部 - 金额和操作 */
|
|
.order-footer {
|
|
background-color: #f8f9fa;
|
|
padding: 15px 20px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
border-top: 1px solid #eee;
|
|
}
|
|
|
|
.order-summary {
|
|
text-align: right;
|
|
}
|
|
|
|
.order-amount {
|
|
color: #333;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.order-amount strong {
|
|
color: #ff4d4f;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.order-tips {
|
|
font-size: 12px;
|
|
color: #999;
|
|
}
|
|
|
|
.order-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
}
|
|
</style>
|
|
|
|
|
|
|
|
|