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.

298 lines
12 KiB

11 months ago
<script setup lang="ts">
import { refundDetailApi } from '~/server/orderApi'
import useOrder from '~/composables/useOrder'
import { ref, reactive } from 'vue'
const { handleIntoPage } = useOrder()
import { orderRefundTipsStatusFilter, orderRefundFilter } from '~/utils/filter'
import useOrderRefund from '~/composables/useOrderRefund'
import ReturningGoods from '~/pages/order/components/returningGoods.vue'
import { merchantAddressApi, merCustomerApi } from '~/server/merchantApi'
import { ItemObject } from '~/types/global'
import { QuestionFilled } from '@element-plus/icons-vue'
const route = useRoute()
const refundOrderNo = ref<string>(<string>route.query.refundOrderNo)
const loading = ref<boolean>(false)
const type = ref<number>(0) //订单类型 0-普通订单,1-视频号订单,2-秒杀订单
const { onRevokeRefund } = useOrderRefund()
//复制
const { handleCopy } = useCopy()
const copyText = () => {
handleCopy(orderInfo.trackingNumber)
}
/**
* 退款订单详情
*/
onMounted(() => {
getOrderRefundDetail()
})
const orderInfo = reactive({})
const cartInfo = ref([]) //再次购买加入购物车的商品
const userAddress = ref([])
const isUserAddress = ref<boolean>(false) //是否只显示一次收货地址
const getOrderRefundDetail = async () => {
loading.value = true
await refundDetailApi(refundOrderNo.value)
.then((res) => {
Object.assign(orderInfo, res)
//商户地址
if (orderInfo.returnGoodsType === 2) getMerchantAddress()
//客服配置
getChatConfig()
userAddress.value = res.merchantOrderList.filter((item: any) => {
return item.shippingType === 1
})
cartInfo.value = res.merchantOrderList[0].orderInfoList
isUserAddress.value = userAddress.value.length > 0 ? true : false
loading.value = false
})
.catch(() => {
loading.value = false
})
}
//商户地址
const merchantAddress = ref<string>('')
const getMerchantAddress = async () => {
merchantAddress.value = await merchantAddressApi(orderInfo.merId)
}
//获取客服配置
const { chatConfig } = useOrder()
const chatConfigData = reactive<ItemObject>({})
const getChatConfig = async () => {
let data = await merCustomerApi(orderInfo.merId)
Object.assign(chatConfigData, data)
}
//联系客服
const handleChat = async () => {
await chatConfig(chatConfigData)
}
//撤销售后
const handleRevokeRefund = async (refundOrderNo: string) => {
await onRevokeRefund(refundOrderNo).then(async () => {
await getOrderRefundDetail()
})
}
//退回弹窗
const { bool: dialogVisible, DialogOpen, DialogClose } = useDialog()
//退回商品
const returnGoodsType = ref<number>(0) //退回状态
const handleReturningRefund = async (item: any) => {
returnGoodsType.value = item.returnGoodsType
DialogOpen()
}
//退回提交成功回调
const handleSubmitSuccess = async () => {
await getOrderRefundDetail()
await DialogClose()
}
//关闭弹窗
const handleSubmitClose = () => {
DialogClose()
}
</script>
<template>
<div class="wrapper_1200" v-loading="loading">
<page-header title="售后详情" menuTitle="售后/退款"></page-header>
<!--订单状态 refundStatus售后状态0:待审核 1:商家拒绝 2退款中 3:已退款 4:用户退货 5:商家待收货 6:已撤销-->
<div class="w-100% borRadius bg-#FFF py-18px px-30px mbtom20">
<div class="fontColor333 text-20px font-500 oppoSans-M mb-15px acea-row items-center">
<div class="mr-10px">{{ orderRefundFilter(orderInfo.refundStatus) }}</div>
<div v-show="orderInfo.refundStatus === 3" class="text-18px font-color dinProSemiBold">
<span class="text-12px"></span>{{ orderInfo.refundPrice }}
</div>
</div>
<div v-if="orderInfo.refundStatus === 1" class="text-#666 text-14px font-400 oppoSans-R">
{{ orderInfo.refundReason }}
</div>
<div v-else class="text-#666 text-14px font-400 oppoSans-R">
{{ orderRefundTipsStatusFilter(orderInfo.refundStatus) }}
</div>
</div>
<!-- 物流信息-->
<div
v-if="
orderInfo.refundStatus > 0 &&
orderInfo.afterSalesType === 2 &&
orderInfo.returnGoodsType === 1 &&
orderInfo.expressName &&
orderInfo.trackingNumber
"
class="w-100% borRadius bg-#fff h-90px px-30px py-22px mbtom20 flex-y-center"
>
<div class="text-14px lh-14px w-50px h-50px b-rd-50% bg-#F7F7F7 text-center lh-50px mr-15px">
<span class="iconfont icon-kuaidi" style="font-size: 24px"></span>
</div>
<div class="font-400 text-14px oppoSans-R">
<div class="oppoSans-R mb-14px text-#333333">
<span>快递公司{{ orderInfo.expressName }}</span>
<span class="ml-50px">联系电话{{ orderInfo.telephone }}</span>
</div>
<div class="oppoSans-R text-#333333">
快递单号 {{ orderInfo.trackingNumber
}}<span
class="text-#333333 ml-10px oppoSans-R borderSol b-rd-10px w-40px h-20px lh-20px text-12px inline-block text-center cursors"
@click="copyText"
>复制</span
>
</div>
</div>
</div>
<!-- 用户到店退回联系电话-->
<div
v-if="
orderInfo.refundStatus > 0 &&
orderInfo.afterSalesType === 2 &&
orderInfo.returnGoodsType === 2 && orderInfo.telephone
"
class="w-100% borRadius bg-#fff h-90px px-30px py-22px mbtom20 flex-y-center"
>
<div class="text-14px lh-14px w-50px h-50px b-rd-50% bg-#F7F7F7 text-center lh-50px mr-15px">
<span class="iconfont icon-kuaidi" style="font-size: 24px"></span>
</div>
<div class="font-400 text-14px oppoSans-R">
<div class="oppoSans-R text-#333333">
<span>联系电话{{ orderInfo.telephone }}</span>
</div>
</div>
</div>
<!--退回地址,订单待审核之后有地址展示无地址不展示-->
<div
v-if="orderInfo.refundStatus>0 && ((orderInfo.returnGoodsType ===1 && orderInfo.receiver && orderInfo.receiverPhone) || (orderInfo.returnGoodsType === 2 &&merchantAddress))"
class="w-100% borRadius bg-#FFF py-30px px-30px mbtom20"
>
<div class="fontColor333 text-16px mb-30px">{{ orderInfo.returnGoodsType === 1 ? '退回地址' : '商家地址' }}</div>
<div v-if="orderInfo.returnGoodsType === 1 && orderInfo.receiver && orderInfo.receiverPhone" class="acea-row">
<div class="text-14px text-#666">
<div class="mb-20px oppoSans-R">收货人{{ orderInfo.receiver }}</div>
<div class="mb-20px oppoSans-R">联系电话{{ orderInfo.receiverPhone }}</div>
<div class="oppoSans-R">收货地址{{ orderInfo.receiverAddressDetail }}</div>
</div>
</div>
<div v-if="orderInfo.returnGoodsType === 2" class="acea-row">
<div class="text-14px text-#666">
<div class="mb-20px oppoSans-R">商户名称{{ merchantAddress.name }}</div>
<div class="mb-20px oppoSans-R">联系电话{{ merchantAddress.phone }}</div>
<div class="oppoSans-R">收货地址{{ merchantAddress.addressDetail }}</div>
</div>
</div>
</div>
<!--售后信息-->
<div class="w-100% borRadius bg-#FFF py-30px px-30px mbtom20">
<div class="fontColor333 text-16px mb-30px">售后信息</div>
<div class="acea-row">
<div class="text-14px text-#666 w-540px oppoSans-R">
<div class="mb-20px oppoSans-R">售后单号{{ orderInfo.refundOrderNo }}</div>
<div class="mb-20px oppoSans-R">申请时间{{ orderInfo.createTime }}</div>
<div class="mb-20px oppoSans-R">售后类型{{ orderInfo.afterSalesType === 1 ? '仅退款' : '退货退款' }}</div>
<div v-if="orderInfo.returnGoodsType !== 0" class="mb-20px oppoSans-R">
退货方式{{
orderInfo.returnGoodsType === 0 ? '不退货' : orderInfo.returnGoodsType === 1 ? '快递退回' : '到店退货'
}}
</div>
<div class="oppoSans-R mb-20px">退款件数{{ orderInfo.applyRefundNum }}</div>
<div class="oppoSans-R">退款方式原路返回</div>
</div>
<div class="w-1px h-124px bg-#EEEEEE"></div>
<div class="text-14px text-#666 ml-30px w-565px">
<div class="mb-20px oppoSans-R flex-y-center">
退款金额{{ orderInfo.refundPrice }}
<div class="cursors acea-row">
<el-tooltip class="box-item" effect="light" placement="bottom-start">
<template #content>
1. 在线支付退款金额原路返还<br />2. 符合退款规则的优惠券直接退回您已领取优惠券 <br />3.
抵扣积分退回与赠送积分扣除系统自动进行</template
>
<el-icon color="#CCCCCC" class="ml-6px"><QuestionFilled /></el-icon>
</el-tooltip>
</div>
</div>
<div class="mb-20px oppoSans-R">退款原因{{ orderInfo.refundReasonWap }}</div>
<div class="mb-20px oppoSans-R">
备注说明{{ orderInfo.refundReasonWapExplain ? orderInfo.refundReasonWapExplain : '-' }}
</div>
<div class="acea-row oppoSans-R">
售后凭证
<div v-if="orderInfo.refundReasonWapImg">
<el-image
v-for="item in orderInfo.refundReasonWapImg.split(',')"
:src="item"
:preview-src-list="orderInfo.refundReasonWapImg.split(',')"
class="cursors w-66px h-66px b-rd-6px mr-10px"
></el-image>
</div>
<div> - </div>
</div>
</div>
</div>
</div>
<!--商品信息-->
<div class="w-100% borRadius bg-#FFF py-30px px-30px mbtom20">
<div class="flex-between-center mb-30px">
<div class="fontColor333 text-16px">商品信息</div>
<div class="text-#999999 font-400 oppoSans-R text-14px">
订单号<span class="text-#333333 font-400 oppoSans-R text-14px">{{ orderInfo.orderNo }}</span>
</div>
</div>
<confirm-product :list="orderInfo" :productType="orderInfo.productType"></confirm-product>
</div>
<!--操作按钮-->
<!-- 售后状态0:待审核 1:商家拒绝 2退款中 3:已退款 4:用户退货 5:商家待收货 6:已撤销 -->
<!-- v-show="orderInfo.refundStatus !== 3 && orderInfo.refundStatus !== 6"-->
<div class="w-100% borRadius bg-#FFF py-18px px-30px mbtom20 flex-between-center">
<div></div>
<div>
<el-button round class="w-120px btn" @click="handleChat">联系客服</el-button>
<el-button
v-if="orderInfo.refundStatus === 0 || orderInfo.refundStatus === 4 || orderInfo.refundStatus === 5"
round
class="w-120px btn"
@click="handleRevokeRefund(orderInfo.refundOrderNo)"
>撤销售后</el-button
>
<el-button
v-if="orderInfo.refundStatus === 4 && orderInfo.afterSalesType === 2"
round
type="primary"
class="w-120px btn"
@click="handleReturningRefund(orderInfo)"
>退回商品</el-button
>
</div>
</div>
<!--退回商品-->
<returning-goods
:returnGoodsType="returnGoodsType"
:refundOrderNo="refundOrderNo"
:isShowDialog="dialogVisible"
@handleSubmitSuccess="handleSubmitSuccess"
v-if="dialogVisible"
:merchantAddressDetail="merchantAddress"
@handleSubmitClose="handleSubmitClose"
></returning-goods>
</div>
</template>
<style scoped lang="scss">
:deep(.el-step__head.is-success) {
--el-color-success: #e93323;
}
:deep(.el-step__title.is-success) {
--el-color-success: #333333;
}
.btn {
height: 44px;
line-height: 44px;
border-radius: 33px 33px 33px 33px;
font-size: 16px;
}
</style>