2025-06-11 14:35:58 +08:00

468 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<common current-name="supplier">
<template #main>
<div class="user-orders-warp">
<userHeader :title="'订单管理'"></userHeader>
<div class="user-orders-content">
<div class="order-tab">
<el-tabs v-model="activeCurrent" @tab-change="handleClick">
<el-tab-pane v-for="(t, indext) in bottomList" :key="indext" :label="t.title" :name="t.name"> </el-tab-pane>
</el-tabs>
</div>
<div class="order-list-warp">
<div class="order-list">
<div v-show="!show" class="empty">
<img style="width: 300px; height: 300px" src="../../assets/images/empty.png" alt="" />
</div>
<div v-for="(o, indexo) in store.data.records" v-show="show" :key="indexo" class="order-item">
<div class="order-item-top">
<div class="top-l">
<div class="top-item">
<div class="label">订单编号</div>
<div class="val">{{ o.orderNo || '--' }}</div>
</div>
<div class="top-item">
<div class="label">下单时间</div>
<div class="val">{{ o.createTime || '--' }}</div>
</div>
</div>
<div class="top-r">
<div class="top-item">
<div class="label">订单金额</div>
<div class="val amount">{{ o.totalAmount.toFixed(2) || '0.00' }}</div>
</div>
</div>
</div>
<div v-if="o.orderItemInfos && o.orderItemInfos.length > 0" class="order-item-content">
<div class="content-list">
<div v-for="(g, indexg) in o.orderItemInfos" :key="indexg" class="good-item">
<div class="good-img">
<img class="good-img" :src="g.productImage" alt="" />
<!-- <costomImg
:url="'images/ecommerce/' + 'pic.png'"
:preview-list="[getAssetsFile('images/ecommerce/' + 'pic.png')?.href ?? '']"
:is-view="false"
></costomImg> -->
</div>
<div class="good-info">
<div class="good-info-pos">
<div class="txt-ellipsis clamp2">{{ g.productName || '--' }}</div>
<div v-if="o.refundAuditResult == '拒绝退款' && o.orderStatus == '10'" style="color: red; font-size: 15px">
已拒绝退款{{ o.refundFailReason }}
</div>
</div>
</div>
<div class="good-price-num">
<div class="good-price-num-pos">
<div class="price">{{ g.unitPrice }} / {{ g.unit }} * {{ g.quantity }}</div>
<div class="total">
<div class="amount">{{ (g.unitPrice * g.quantity).toFixed(2) }}</div>
<!-- <div class="amount">{{ (g.unitPrice * g.quantity + g.carriage).toFixed(2) }}</div> -->
<!-- <div class="carriage">( 含运费{{ g.carriage.toFixed(2) }})</div> -->
</div>
</div>
</div>
</div>
</div>
<div class="content-right">
<div class="content-right-pos">
<div v-if="o.orderStatus == '1'" class="right-item do-btn">
<el-button type="primary" @click="doPay(o.id)">立即付款</el-button>
</div>
<div v-if="o.orderStatus == '4' || o.orderStatus == '5'" class="right-item do-btn">
<el-button type="primary" @click="sureToReceives(o.id)">确认收货</el-button>
</div>
<div v-if="o.orderStatus == '1'" class="right-item do-btn">
<el-button @click="doCancel(o.id)">取消订单</el-button>
</div>
<div
v-if="o.orderStatus == '2' || o.orderStatus == '3' || o.orderStatus == '4' || o.orderStatus == '5'"
class="right-item do-btn"
>
<el-button type="danger" @click="doPay(o.id)">退货/退款</el-button>
</div>
<!-- <div v-if="o.orderStatus == '5'" class="right-item">已发货</div> -->
<!-- <div v-if="o.orderStatus == '5'" class="right-item text-link">快递单号</div> -->
<el-button type="primary" class="right-item do-btn" @click="goInfo(o.id)">订单详情</el-button>
<div class="right-item text-link">
{{
o.orderStatus == '7'
? '已取消'
: o.orderStatus == '8'
? '已完成'
: o.orderStatus == '4'
? '已发货'
: o.orderStatus == '5'
? '待收货'
: o.orderStatus == '6'
? '已收货'
: o.orderStatus == '10'
? '退款中'
: o.orderStatus == '11'
? '已退款'
: ''
}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="pager">
<div style="margin-bottom: 3px">{{ total }}</div>
<el-pagination :page-size="20" :pager-count="11" layout="prev, pager, next" :total="total" @change="pagerChange" />
</div>
</div>
</div>
</div>
</template>
</common>
</div>
</template>
<script setup>
import { ElMessage } from 'element-plus';
import common from './components/common.vue';
import { ref, reactive, onMounted } from 'vue';
import { isEmpty, getAssetsFile } from '@/utils';
import { useRoute, useRouter } from 'vue-router';
import userHeader from './components/userHeader.vue';
import { cancelOrder, sureToReceive } from '../../apis/user';
import { useGetUserOrder } from '../../store/modules/userOrder';
let store = useGetUserOrder();
const route = useRoute();
const router = useRouter();
let page = reactive({
current: 1,
size: 20,
});
let total = ref(0);
let show = ref(false);
let handleClick = (value) => {
activeCurrent.value = value;
page.orderStatus = value;
if (value == 5) {
page.orderStatus = value + ',4';
}
store.getData(page).then((res) => {
total.value = res.total;
if (res.records.length > 0) {
show.value = true;
} else {
show.value = false;
}
console.log(show.value);
});
};
const pagerChange = (value) => {
console.log(page);
page.current = value;
store.getData(page).then((res) => {
if (res.records.length > 0) {
show.value = true;
} else {
show.value = false;
}
console.log(show.value);
});
};
const goInfo = (id) => {
router.push({
path: '/sub-operation-service/orderDetails',
query: { id: id, page: JSON.stringify(page) },
});
};
let bottomList = reactive([
{ title: '全部', name: 'all' },
{ title: '待付款', name: '1' },
{ title: '待发货', name: '3' },
// { title: '已发货', name: '6' },
{ title: '待收货', name: '4' },
{ title: '已收货', name: '6' },
{ title: '退款中', name: '10' },
{ title: '已退款', name: '11' },
]);
onMounted(() => {
page.orderStatus = 'all';
store.getData(page).then((res) => {
total.value = res.total;
if (res.records.length > 0) {
show.value = true;
} else {
show.value = false;
}
});
});
const sureToReceives = (id) => {
sureToReceive({ orderId: id }).then((res) => {
ElMessage({
message: '确认收货成功',
type: 'success',
plain: true,
});
store.getData(page);
});
};
let activeCurrent = ref('all');
let orderList = reactive([
{
id: '1',
orderNo: 'YH8888888888',
createTime: '2025.01.01 10:00:00',
payAmount: 81,
status: 0,
goodlist: [
{ id: '001', title: '耿马镇 原生态 有机 西红柿', price: 4.9, unit: '份', num: 10, carriage: 6 },
{ id: '002', title: '耿马镇 原生态 有机 西蓝花', price: 2.6, unit: '份', num: 10, carriage: 0 },
],
},
{
id: '2',
orderNo: 'YH8888888889',
createTime: '2025.02.01 10:00:00',
payAmount: 110,
status: 1,
goodlist: [
{ id: '001', title: '耿马镇 原生态 有机 西红柿', price: 4.8, unit: '份', num: 10, carriage: 6 },
{ id: '002', title: '耿马镇 原生态 有机 西蓝花', price: 2.5, unit: '份', num: 10, carriage: 6 },
{ id: '002', title: '耿马镇 原生态 有机 茄子', price: 2.5, unit: '份', num: 10, carriage: 0 },
],
},
{
id: '3',
orderNo: 'YH8888888899',
createTime: '2025.02.01 10:00:00',
payAmount: 85,
status: 2,
goodlist: [
{ id: '001', title: '勐简镇 原生态 有机 西红柿', price: 4.8, unit: '份', num: 10, carriage: 6 },
{ id: '002', title: '勐简镇 原生态 有机 西蓝花', price: 2.5, unit: '份', num: 10, carriage: 6 },
],
},
]);
const doPay = (id) => {
router.push({
path: '/sub-operation-service/orderDetails',
query: { id: id, page: JSON.stringify(page) },
});
};
const doCancel = (id) => {
cancelOrder({ id: id }).then((res) => {
ElMessage({
message: '取消订单成功',
type: 'success',
plain: true,
});
store.getData(page);
});
};
</script>
<style lang="scss" scoped>
.pager {
align-items: center;
display: flex;
position: fixed;
bottom: 42px;
color: #999999;
font-size: 12px;
}
.user-orders-warp {
width: 100%;
.user-orders-content {
margin-top: 16px;
padding: 16px 16px 30px 16px;
width: 100%;
height: calc(100vh - 136px);
border-radius: 16px;
background: $color-fff;
}
.order-tab {
width: 100%;
::v-deep() {
.el-tabs__nav-wrap::after {
background: transparent !important;
}
.el-tabs__item {
font-size: 20px !important;
}
.el-tabs__active-bar {
height: 5px !important;
border-radius: 4px;
}
.el-descriptions__label,
.el-descriptions__content {
font-size: 16px !important;
}
.cell-item {
display: inline-flex;
}
.el-descriptions__label {
color: $color-999;
}
.el-descriptions__content {
color: $color-333;
}
}
}
.order-list-warp {
position: relative;
overflow-y: auto;
width: 100%;
height: calc(100% - 60px);
.order-list {
width: 100%;
.empty {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 500px;
}
.order-item {
width: 100%;
.order-item-top {
display: inline-flex;
padding: 16px 0;
width: 100%;
.top-l,
.top-r {
display: inline-block;
vertical-align: middle;
}
.top-l {
display: inline-flex;
justify-content: flex-start;
width: 80%;
gap: 64px;
}
.top-r {
text-align: right;
}
.top-item {
display: inline-flex;
justify-content: flex-start;
.label,
.val {
font-size: 18px;
}
.label {
padding-right: 8px;
}
.amount::before {
content: '¥';
}
}
}
.order-item-content {
display: inline-flex;
width: 100%;
border-radius: 16px;
background: $color-f5;
.content-list,
.content-right {
display: inline-block;
vertical-align: top;
}
.content-list {
width: calc(100% - 160px);
.good-item {
display: inline-flex;
justify-content: flex-start;
margin: 8px 0;
padding-left: 16px;
width: 100%;
gap: 16px;
}
.good-img,
.good-info,
.good-price-num {
display: inline-block;
vertical-align: middle;
}
.good-img {
width: 120px;
height: 120px;
}
.good-info {
display: inline-flex;
justify-content: center;
width: 200px;
flex-direction: column;
.good-info-pos {
font-size: 18px;
color: $color-666;
}
}
.good-price-num {
display: inline-flex;
justify-content: center;
width: calc(100% - 340px);
flex-direction: column;
.good-price-num-pos {
display: inline-flex;
justify-content: space-around;
gap: 16px;
.price,
.total {
font-size: 20px;
}
.price {
font-weight: 400;
}
.total {
text-align: center;
.amount {
font-weight: 700;
color: $color-main;
}
.amount::before {
content: '¥';
}
.carriage {
font-size: 16px;
color: $color-666;
}
}
}
}
}
.content-right {
display: inline-flex;
justify-content: center;
width: 160px;
text-align: center;
flex-direction: column;
.content-right-pos {
.text-normal {
cursor: pointer;
font-size: 16px;
}
.text-link {
font-size: 16px;
color: $color-main;
cursor: pointer;
}
}
.do-btn {
margin-top: 8px;
}
}
}
}
}
}
}
</style>