erp/resources/frontend/src/views/plat/afterSaleOrder.vue

264 lines
8.1 KiB
Vue
Raw Normal View History

<template>
<div class="pageBox">
<div class="cardBox">
<div class="searchBox">
<div class="row">
<span>店铺</span>
<el-select v-model="filter.shop_id" placeholder="店铺">
<el-option v-for="item in shopsList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row">
<span>售后单状态</span>
<el-select v-model="filter.after_sales_status" placeholder="请选择">
<el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row">
<span>订单编号</span>
<el-input v-model="filter.order_sn" clearable></el-input>
</div>
<div class="row">
<span>售后单编号</span>
<el-input v-model="filter.after_sales_biz_sn" clearable></el-input>
</div>
<div class="row">
<span>创建时间</span>
<el-date-picker
v-model="addTime"
type="datetimerange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 340px">
</el-date-picker>
</div>
<div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
2024-11-04 14:44:52 +08:00
<el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</div>
</div>
</div>
<el-card>
<el-table v-loading="loading" :data="afterList" style="width: 100%" border>
<el-table-column prop="after_sales_biz_sn" label="售后单编号" />
<el-table-column prop="order_sn" label="父订单编号" />
2024-08-24 14:50:12 +08:00
<el-table-column label="店铺">
<template slot-scope="scope">
<span>{{ Shops[scope.row.shop_id] }}</span>
</template>
</el-table-column>
<el-table-column prop="refund_amount" label="退款金额" />
<el-table-column prop="refund_shipping_amount" label="用户申请退运费金额" />
<el-table-column prop="reason" label="退款原因" />
2024-08-07 18:17:56 +08:00
<el-table-column prop="description" label="描述" />
<el-table-column label="退款图片" width="220">
<template slot-scope="scope">
<div class="imgBox" v-if="scope.row.image_list">
<el-image v-for="(it, i) in scope.row.image_list" :key="i" :src="it" :preview-src-list="scope.row.image_list" class="img"></el-image>
</div>
</template>
</el-table-column>
2024-11-04 14:44:52 +08:00
<el-table-column prop="apply_type" label="申请类型">
<template slot-scope="scope">
<span>{{ APPLYTYPE[scope.row.apply_type] }}</span>
</template>
</el-table-column>
<el-table-column label="售后单状态">
<template slot-scope="scope">
<span>{{ STATUS[scope.row.after_sales_status] }}</span>
</template>
</el-table-column>
<el-table-column prop="after_sale_created_at" label="售后单创建时间" />
</el-table>
<div class="page-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
2024-08-24 14:50:12 +08:00
layout="prev, pager, next, sizes, total, jumper"
:total="total">
</el-pagination>
</div>
</el-card>
</div>
</template>
<script>
2024-11-04 14:44:52 +08:00
import { getAfterSaleOrders, exportAfterOrder } from "@/api/plat"
import { storeList } from "@/api/shop"
2024-11-04 14:08:48 +08:00
import dayjs from 'dayjs'
export default {
data() {
return {
loading: false,
page: 1,
pageSize: 10,
total: 0,
afterList: [],
filter: {
shop_id: '',
after_sales_status: '',
order_sn: '',
after_sales_biz_sn: ''
},
shopsList: [],
Shops: {},
addTime: [],
statusList: [
{ id: 0, name: '未发起售后' },
{ id: 1, name: '退款中' },
{ id: 2, name: '退款成功' },
{ id: 3, name: '待处理' },
{ id: 4, name: '拒绝退款' },
{ id: 6, name: '待(顾客)退货' },
{ id: 7, name: '待(团长)确认退货' },
{ id: 8, name: '(顾客)撤销' },
{ id: 9, name: '(系统)关闭' }
],
STATUS: {
'0': '未发起售后',
'1': '退款中',
'2': '退款成功',
'3': '待处理',
'4': '拒绝退款',
'6': '待(顾客)退货',
'7': '待(团长)确认退货',
'8': '(顾客)撤销',
2024-08-24 14:50:12 +08:00
'9': '(系统)关闭'
2024-11-04 14:44:52 +08:00
},
APPLYTYPE: {
0: '仅退款',
1: '退货退款'
},
exportLoading: false
}
},
methods: {
fetchList() {
this.loading = true
let params = {
page: this.page,
per_page: this.pageSize,
...this.filter,
created_at_start: this.addTime ? this.addTime[0] : '',
created_at_end: this.addTime ? this.addTime[1] : ''
}
getAfterSaleOrders(params).then((res) => {
this.afterList = res.data.data
this.total = res.data.meta.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
handleSizeChange(val) {
this.page = 1
this.pageSize = val
this.fetchList()
},
handleCurrentChange(val) {
this.page = val
this.fetchList()
},
handleSearch() {
this.page = 1
this.fetchList()
},
getShopsList() {
let params = {
page: 1,
per_page: 999
}
storeList(params).then((res) => {
this.shopsList = res.data.data
res.data.data.forEach((it) => {
this.Shops[it.id] = it.name
})
})
2024-11-04 14:08:48 +08:00
},
handleExport() {
2024-11-04 14:44:52 +08:00
this.exportLoading = true
2024-11-04 14:08:48 +08:00
let params = {
...this.filter,
created_at_start: this.addTime ? this.addTime[0] : '',
2024-11-04 14:44:52 +08:00
created_at_end: this.addTime ? this.addTime[1] : '',
is_export: 1
}
// window.open("/api/plat_after_sale_orders?" + this.objectToQueryString(params))
exportAfterOrder(params).then((res) => {
console.log(res.data)
this.downLoadXls(res.data)
this.$message({ type: 'success', message: '导出成功!' })
this.exportLoading = false
}).catch(() => {
this.exportLoading = false
})
},
downLoadXls(response) {
const content = response
const blob = new Blob([content])
const today = new Date().toLocaleDateString()
const fileName = `售后单列表${today}.xlsx`
if ('download' in document.createElement('a')) {
// 非IE下载
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象
document.body.removeChild(elink)
} else {
// IE10+下载
navigator.msSaveBlob(blob, fileName)
2024-11-04 14:08:48 +08:00
}
},
objectToQueryString(obj) {
return Object.keys(obj)
.map(key => encodeURIComponent(key) + '=' + (obj[key] ? encodeURIComponent(obj[key]) : ''))
.join('&');
}
},
mounted() {
2024-11-04 14:08:48 +08:00
let end = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
let start = dayjs().subtract(30, 'day').format('YYYY-MM-DD') + ' 00:00:00'
this.addTime = [start, end]
this.getShopsList()
2024-08-24 14:50:12 +08:00
this.fetchList()
}
}
</script>
<style lang="scss" scoped>
.searchBox{
display: flex;
align-items: center;
flex-wrap: wrap;
white-space: nowrap;
.row{
font-size: 14px;
margin-bottom: 20px;
margin-right: 15px;
display: flex;
align-items: center;
}
}
2024-08-07 18:17:56 +08:00
.imgBox{
.img{
width: 55px;
height: 55px;
border-radius: 4px;
margin: 3px;
}
}
</style>