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.

277 lines
8.8 KiB

11 months ago
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { Search } from '@element-plus/icons-vue'
const { handleIntoPage } = useOrder()
const tabList = ref([
{
name: '售后申请',
type: -1,
},
{
name: '处理中',
type: 0,
},
{
name: '申请记录',
type: 9,
},
])
const route = useRoute()
const orderNo = ref<string>(<string>route.query.orderNo) //订单号
/**
* 售后申请列表
*/
import { PageQuery } from '~/types/global'
import { refundApplyListApi, refundListApi } from '~/server/orderApi'
import { orderRefundStatusFilter } from '~/utils/filter'
const refundStatus = ref<number>(-1)
const where = reactive<PageQuery>({
page: 1,
limit: 10,
keywords: orderNo.value?orderNo.value:'',
type: refundStatus.value > -1 ? refundStatus.value : null,
})
const {
data: tableData,
refresh,
pending: listLoading,
} = await useAsyncData(async () => (refundStatus.value > -1 ? refundListApi(where) : refundApplyListApi(where)), {
default: () => ({
list: [],
total: 0,
}),
})
// 分页数据
const pageChange = (e: number) => {
where.page = e
refresh()
}
const handleChangeTab = async (type: number) => {
refundStatus.value = type
where.type = type
where.page = 1
refresh()
}
//去订单详情
import useOrder from '~/composables/useOrder'
const handleToOrderDetails = (refundOrderNo: string) => {
if(refundStatus.value === -1) return;
listLoading.value = true
linkNavigateTo(`/order/orderRefund_details`, { refundOrderNo: refundOrderNo })
}
//申请退款
import { linkNavigateTo } from '~/utils/util'
import { useAppStore } from '~/stores/app'
import { ProductInfo } from '~/types/order'
import useOrderRefund from '~/composables/useOrderRefund'
import ReturningGoods from '~/pages/order/components/returningGoods.vue'
const useStore = useAppStore()
const { onRevokeRefund } = useOrderRefund()
const handleApplyRefund = (item: ProductInfo) => {
useStore.getEvaluationInfo(<ProductInfo>item)
linkNavigateTo(`/order/apply_refund`)
}
//撤销售后
const handleRevokeRefund = async (refundOrderNo: string) => {
await onRevokeRefund(refundOrderNo).then(async () => {
await refresh()
})
}
//退回弹窗
const { bool: dialogVisible, DialogOpen, DialogClose } = useDialog()
//退回商品
const returnGoodsType = ref<number>(0) //退回状态
const refundOrderNo = ref<string>('') //退款单号
const merId = ref<number>(0)
const handleReturningRefund = async (item: any) => {
returnGoodsType.value = item.returnGoodsType
refundOrderNo.value = item.refundOrderNo
merId.value = item.merId
DialogOpen()
}
//退回提交成功回调
const handleSubmitSuccess = ()=>{
DialogClose()
refresh()
}
//关闭弹窗
const handleSubmitClose = () => {
DialogClose()
}
//跳转至申请记录
const onHandlerToRecord = async (orderNo:string)=>{
where.keywords = orderNo
refundStatus.value = 9
where.type = 9
where.page = 1
refresh()
}
</script>
<template>
<div class="order-list h-100%" v-loading="listLoading">
<!--tab导航信息-->
<div class="flex-between-center mb-23px">
<div class="acea-row">
<div
v-for="item in tabList"
:key="item.type"
class="item text-16px mr-50px cursor-pointer"
:class="refundStatus === item.type ? 'font-color font-500' : 'text-#666'"
@click="handleChangeTab(item.type)"
>
{{ item.name }}
</div>
</div>
<el-input @keyup.enter="refresh" v-model="where.keywords" style="width: 300px" placeholder="根据商品名称/退款订单号/订单编号搜索">
<template #prefix>
<el-icon class="el-input__icon"><search /></el-icon>
</template>
</el-input>
</div>
<!--订单信息-->
<div v-if="tableData.total > 0">
<div v-for="item in tableData.list" :key="item.id" class="b-rd-12px w-100% overflow-hidden borderSol-eee mb-20px">
<div class="h-54px lh-52px text-14px flex-between-center bg-#FAFAFA px-20px">
<div class="flex items-center">
<div v-if="refundStatus > -1" class="text-#fff labelClass mr-20px bg-#E93323">
{{ orderRefundStatusFilter(item.refundStatus) }}
</div>
<div class="text-#999999 mr-50px oppoSans-R">
{{ refundStatus === -1 ? '订单号' : '售后单号' }}<span
class="text-#333333 font-400 orderNo oppoSans-R"
>{{ refundStatus === -1 ? item.orderNo : item.refundOrderNo }}</span
>
</div>
<div
@click.stop="handleIntoPage('/merchant/merchant_home', { merId: item.merId })"
v-show="item.merName"
class="cursors text-14px merchant-home"
>
<span class="iconfont icon-guanzhudianpu mr-5px line1" style="font-size: 14px"></span
><span>{{ item.merName }}</span>
</div>
</div>
<div v-if="item.payPrice && refundStatus === -1" class="text-12px fontColor333 dinProSemiBold">
<span class="oppoSans-M">实付金额</span
> <span class="oppoSans-M"></span><span class="text-20px dinProRegular font-600">{{ item.payPrice }}</span>
</div>
<div v-if="item.refundPrice && refundStatus > -1" class="text-12px fontColor333 dinProSemiBold">
<span class="oppoSans-M">退款金额</span
><span class="text-20px dinProRegular font-600">{{ item.refundPrice }}</span>
</div>
</div>
<div class="flex-between-center pl-20px">
<div
@click="handleToOrderDetails(item.refundOrderNo)"
class="w-786px mt-20px mb-20px orderProduct"
style="border-right: 1px dashed #eeeeee"
>
<order-product :list="item" :refundStatus="refundStatus" @onHandlerToRecord="onHandlerToRecord"></order-product>
</div>
<!--操作-->
<!-- 售后状态0:待审核 1:商家拒绝 2退款中 3:已退款 4:用户退货 5:商家待收货 6:已撤销 售后类型1-仅退款2-退货退款 -->
<div class="w-180px py-20px handleBtnBox">
<div
v-if="refundStatus === -1"
class="cursors m-auto w-86px h-30px lh-29px b-rd-15px text-center font-color text-12px "
@click="handleApplyRefund(item)"
>
申请退款
</div>
<div
v-if="item.refundStatus === 4 && item.afterSalesType === 2"
class="cursors m-auto w-86px h-30px lh-29px b-rd-15px text-center text-12px mb-14px text-#333 borderSol"
@click="handleReturningRefund(item)"
>
退回商品
</div>
<div
v-if="item.refundStatus === 0 || item.refundStatus === 4 || item.refundStatus === 5"
@click="handleRevokeRefund(item.refundOrderNo)"
class="cursors m-auto borderSol w-86px h-30px lh-29px b-rd-15px text-#333 text-center text-12px"
>
撤销售后
</div>
<div
v-if="refundStatus !== -1"
@click="handleToOrderDetails(item.refundOrderNo)"
class="cursors m-auto w-86px h-30px lh-29px b-rd-15px text-center text-#333 text-12px borderSol mt-14px"
>
查看详情
</div>
</div>
</div>
</div>
<div class="acea-row row-middle mt-30px">
<el-pagination
background
layout="prev, pager, next"
:total="tableData.total"
:page-size="where.limit"
:current-page="where.page"
@update:current-page="pageChange"
class="page-item"
/>
</div>
</div>
<div v-else class="w-100%">
<empty-page title="暂无订单呦~">
<template v-slot:emptyImage>
<img src="@/assets/images/wudingdan.png" />
</template>
</empty-page>
</div>
<!--退回商品-->
<returning-goods :returnGoodsType="returnGoodsType" :refundOrderNo="refundOrderNo" :isShowDialog="dialogVisible" @handleSubmitSuccess="handleSubmitSuccess" :merId="merId"
v-if="dialogVisible"
@handleSubmitClose="handleSubmitClose"></returning-goods>
</div>
</template>
<style scoped lang="scss">
.handleBtnBox{
div:first-of-type {
border: 1px solid #e93323 !important;
color: #e93323 !important;
}
}
.merchant-home {
color: #333333;
&:hover {
color: #e93323 !important;
}
}
.orderNo {
&:hover {
color: #e93323 !important;
}
}
.order-list {
:deep(.el-input__wrapper) {
border: none !important;
box-shadow: none !important;
}
:deep(.el-input) {
--el-fill-color-blank: #f7f7f7 !important;
--el-border-radius-base: 20px;
}
}
.orderProduct {
:deep(.orderProduct) {
&:last-child {
margin-bottom: 0 !important;
}
}
}
</style>