2025-06-10 13:54:50 +08:00

420 lines
14 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>
<el-dialog v-model="refundVs" title="退货/退款" width="800" :before-close="handleClose">
<div class="refundVs-title">退货/退款原因</div>
<el-select v-model="optionsValue" placeholder="Select" size="large" style="width: 765px" @change="change">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<div class="refundVs-title" style="margin-top: 15px">退货/退款描述</div>
<el-input v-model="input" type="textarea" size="large" style="width: 765px" placeholder="退货/退款描述" clearable />
<template #footer>
<div class="dialog-footer">
<el-button @click="refundVs = false">取消</el-button>
<el-button type="primary" @click="upRefund()"> 确认 </el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="dialogVisible" title="修改地址" width="800" :before-close="handleClose">
<el-radio-group v-model="radio1" @change="changeAddress">
<el-radio v-for="(item, index) in data" :key="item.id" :value="item.id"
><div style="font-size: 15px">
联系人:{{ item.receiverName }}, 联系人手机号:{{ item.receiverPhone }}, 地址:{{ item.postArea }} {{ item.postAddress }}
</div></el-radio
>
</el-radio-group>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="upAddress()"> 确认 </el-button>
</div>
</template>
</el-dialog>
<common current-name="order">
<template #main>
<div class="user-orders-warp">
<userHeader :title="'订单详情'"></userHeader>
<div class="user-orders-content">
<div class="order-tab">
<div class="order-tab-title">
<el-icon style="cursor: pointer" size="30" @click="back()"><ArrowLeftBold /></el-icon>
<span style="font-weight: bold; color: #25bf82; font-size: 20px">
{{
JSON.parse(route.query.page).orderStatus == '1'
? '待支付'
: JSON.parse(route.query.page).orderStatus == '2' || JSON.parse(route.query.page).orderStatus == '3'
? '待发货'
: JSON.parse(route.query.page).orderStatus == '4' || JSON.parse(route.query.page).orderStatus == '5'
? '已发货'
: JSON.parse(route.query.page).orderStatus == '6'
? '已收货'
: JSON.parse(route.query.page).orderStatus == '7'
? '已取消'
: JSON.parse(route.query.page).orderStatus == '8'
? '已完成'
: ''
}}</span
>
<span v-if="JSON.parse(route.query.page).orderStatus == '1'" style="font-size: 15px">在71小时59分59秒之前发货</span>
</div>
</div>
<div class="order-list-warp">
<div class="order-list-warp-left">
<div style="display: flex; align-items: center; justify-content: flex-start; margin-top: 20px">
<el-icon size="30"><LocationFilled /></el-icon>
<div class="order-list-warp-left-address">
<div>{{ detailsData.receiverAddress }}</div>
<div>{{ detailsData.receiverName }} {{ detailsData.receiverPhone }}</div>
</div>
</div>
<div class="order-list-warp-left-title">商品信息</div>
<div v-for="(item, index) in detailsData.orderItemInfos" :key="item.id" class="order-list-warp-left-goods">
<div class="order-list-warp-left-goods-list">
<img style="width: 100px; height: 100px" :src="item.productImage" alt="" />
<div class="order-list-warp-left-goods-list-info">
<div class="order-list-warp-left-goods-list-info-title">{{ item.productName }}</div>
<div class="order-list-warp-left-goods-list-info-info">{{ item.unitPrice }}/{{ item.unit }}</div>
</div>
</div>
<div>
<div style="color: #25bf82; font-size: 15px">{{ item.subtotalAmount }}</div>
<div style="font-size: 15px; color: #999999; width: 50px; text-align: right">x{{ item.quantity }}</div>
</div>
</div>
</div>
<div class="order-list-warp-right">
<div style="margin-top: 20px">
<div style="width: 100%; text-align: left; font-size: 18px; font-weight: bold">订单详情</div>
<div class="order-list-warp-right-list">
<div>订单编号</div>
<div style="color: #000000">{{ detailsData.orderNo }}</div>
</div>
<div class="order-list-warp-right-list">
<div>订单备注</div>
<div style="color: #000000">{{ detailsData.orderNote ?? '暂无备注' }}</div>
</div>
<div class="order-list-warp-right-list">
<div>商品总数</div>
<div style="color: #000000">{{ detailsData.totalQuantity }}</div>
</div>
<div class="order-list-warp-right-list">
<div>创建时间</div>
<div style="color: #999999">{{ detailsData.createTime }}</div>
</div>
<div v-if="detailsData.paymentTime" class="order-list-warp-right-list">
<div>付款时间</div>
<div style="color: #999999">{{ detailsData.paymentTime }}</div>
</div>
</div>
<div v-if="detailsData.totalAmount" style="margin-top: 30px">
<div style="width: 100%; text-align: left; font-size: 18px; font-weight: bold">付款信息</div>
<div class="order-list-warp-right-list">
<div>商品总价</div>
<div style="color: #000000">{{ detailsData.totalAmount }}</div>
</div>
<div class="order-list-warp-right-list">
<div>运费</div>
<div style="color: #000000">{{ detailsData.totalShipFee }}</div>
</div>
<div class="order-list-warp-right-list">
<div>优惠金额</div>
<div style="color: #999999">{{ detailsData.discountAmount }}</div>
</div>
<div class="order-list-warp-right-list">
<div>实付金额</div>
<div style="color: #999999">{{ detailsData.payableAmount }}</div>
</div>
</div>
</div>
</div>
<div style="display: flex; align-items: center; justify-content: start">
<div v-if="detailsData.orderStatus == '1'" class="button-bottom" @click="doPay(1)">立即付款</div>
<div
v-if="
detailsData.orderStatus == '2' || detailsData.orderStatus == '3' || detailsData.orderStatus == '4' || detailsData.orderStatus == '5'
"
class="button-bottom"
@click="confirmReceipt()"
>
确认收货
</div>
<div class="button-bottoms" @click="reAddress()">修改地址</div>
<div
v-if="
detailsData.orderStatus == '2' || detailsData.orderStatus == '3' || detailsData.orderStatus == '4' || detailsData.orderStatus == '5'
"
class="button-bottoms"
@click="refund()"
>
退货/退款
</div>
<div v-if="detailsData.orderStatus == '1'" class="button-bottoms" @click="doCancel">取消订单</div>
<!-- <div class="button-bottoms">打印订单</div> -->
</div>
</div>
</div>
</template>
</common>
</div>
</template>
<script setup>
import { userPostAddress, upOrderInfoList, confirmOrder } from '../../apis/user';
import common from './components/common.vue';
import { ref, reactive, computed, onMounted } from 'vue';
import userHeader from './components/userHeader.vue';
import { useRoute, useRouter } from 'vue-router';
import { cancelOrder, updateOrderReceiveAddress, orderInfoGetById, refundApprove } from '../../apis/user';
import { useGetUserOrder } from '../../store/modules/userOrder';
let store = useGetUserOrder();
let dialogVisible = ref(false);
let refundVs = ref(false);
const router = useRouter();
const route = useRoute();
let addressId = ref(0);
let data = ref([]);
let detailsData = ref([]);
let radio1 = ref(0);
let input = ref('');
let page = reactive({
orderStatus: 1,
current: 1,
size: 10,
});
let optionsValue = ref('不想要了');
const options = [
{
value: '不想要了',
label: '不想要了',
},
{
value: '与卖家协商一致',
label: '与卖家协商一致',
},
{
value: '货物损坏',
label: '货物损坏',
},
{
value: '实物与宣传不符',
label: '实物与宣传不符',
},
];
onMounted(() => {
getDetails();
getUserAddressList();
});
const confirmReceipt = () => {
getDetails();
};
const change = (value) => {
console.log(value);
optionsValue.value = value;
};
const getDetails = () => {
orderInfoGetById({ id: route.query.id }).then((res) => {
detailsData.value = res.data.records[0];
});
};
const changeAddress = (value) => {
addressId.value = value;
};
const doCancel = () => {
cancelOrder({ id: route.query.id }).then((res) => {
store.getData(JSON.parse(route.query.page)).then((res) => {
router.back();
});
});
};
const refund = () => {
refundVs.value = true;
};
const upRefund = () => {
refundApprove({
orderId: 0,
refundCategory: '1',
refundType: 1,
refundReason: input,
}).then((res) => {
getDetails();
refundVs.value = false;
});
};
const upAddress = () => {
updateOrderReceiveAddress({ orderId: route.query.id, addressId: addressId.value }).then((res) => {
getDetails();
dialogVisible.value = false;
});
};
const reAddress = () => {
dialogVisible.value = true;
};
const doPay = () => {
router.push({
path: '/sub-operation-service/orderSuccess',
query: { id: route.query.id },
});
};
const getUserAddressList = () => {
userPostAddress({ size: 100, current: 1 }).then((res) => {
console.log(res.data.records);
data.value = res.data.records;
});
};
const back = () => {
router.back();
};
</script>
<style lang="scss" scoped>
.refundVs-title {
font-size: 15px;
color: #999999;
margin-bottom: 10px;
}
.user-orders-warp {
width: 100%;
.user-orders-content {
margin-top: 16px;
padding: 16px;
width: 100%;
height: calc(100vh - 136px);
border-radius: 16px;
background: $color-fff;
.order-list-warp {
display: flex;
justify-content: space-between;
width: 100%;
.order-list-warp-left {
width: 55%;
height: 70vh;
.order-list-warp-left-title {
margin-top: 20px;
font-size: 18px;
font-weight: bold;
text-align: left;
}
.order-list-warp-left-goods {
margin-top: 20px;
display: flex;
justify-content: space-between;
.order-list-warp-left-goods-list {
display: flex;
.order-list-warp-left-goods-list-info {
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
height: 100px;
.order-list-warp-left-goods-list-info-title {
text-align: left;
width: 300px;
font-size: 15px;
}
.order-list-warp-left-goods-list-info-info {
margin-top: 10px;
text-align: left;
width: 300px;
font-size: 12px;
color: #999999;
}
}
}
}
.order-list-warp-left-address {
font-size: 15px;
text-align: start;
margin-left: 15px;
}
}
.order-list-warp-right {
width: 40%;
height: 70vh;
.order-list-warp-right-list {
margin-top: 20px;
display: flex;
align-items: center;
justify-content: space-between;
div {
font-size: 14px;
color: #999999;
}
}
}
}
}
.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-tab-title {
width: 100%;
display: flex;
align-items: center;
span {
margin-left: 10px;
}
}
}
}
.button-bottom {
cursor: pointer;
width: 100px;
border-radius: 10px;
height: 40px;
color: #fff;
line-height: 40px;
font-size: 15px;
font-weight: bold;
background-color: #25bf82;
}
.button-bottoms {
cursor: pointer;
margin-left: 20px;
width: 100px;
border-radius: 10px;
height: 40px;
color: #000000;
line-height: 40px;
font-size: 15px;
background-color: #ffffff;
border: 1px solid #707070;
}
</style>