shop_uniapp/components/after-sales-list/after-sales-list.vue

312 lines
8.9 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>
<mescroll-uni ref="mescrollRef" top="80rpx" @init="mescrollInit" @down="downCallback" @up="upCallback"
:down="downOption" :up="upOption">
<view class="sale-list" v-if="type == 'normal'">
<view v-for="(items, index) in lists" :key="index" class="sale-item bg-white m-t-20">
<view class="sale-header">
<shop-title :shop="{name: items.shop_name, id: items.sid}"></shop-title>
</view>
<view v-for="(item, index2) in items.order_goods" :key="index2" class="goods-item">
<view class="sale-content flex row">
<view class="goods-img">
<u-image width="160rpx" height="160rpx" border-radius="6rpx" :src="item.image" />
</view>
<view class="goods-desc flex-1 m-l-24">
<view class="goods-name line-2">{{item.goods_name}}</view>
<view class="m-t-10 line-1 muted">{{item.spec_value_str}}</view>
<view class="flex row-between m-t-20">
<price-format class="sm" :first-size="30" :second-size="30" :subscript-size="26"
:price="item.goods_price" />
<view>x{{item.goods_num}}</view>
</view>
<view class="flex row-between m-t-20">
<view>{{items.order_sn}}</view>
<view class="bold" @click="onCopy(items.order_sn)">复制</view>
</view>
</view>
</view>
<view class="sale-footer flex row-right" v-if="items.allow_after_sale == 1">
<view class="btn row-center primary br60" :class="{'gray-btn': items.after_sale.able_apply == 0}" @tap="applyRefund(items,item)">
申请售后
</view>
</view>
<view class="kefu">
<view>因商品质量问题,可联系客服申请售后</view>
<view class="m-l-10">
<button open-type="contact" hover-class="none">
<u-icon name="server-fill" size="40" color="#999"></u-icon>
</button>
</view>
</view>
</view>
</view>
</view>
<view class="sale-list" v-else-if="type == 'apply'">
<view v-for="(items, index) in lists" :key="index" class="sale-item bg-white m-t-20">
<view class="sale-header flex row-between">
<shop-title :shop="{name: items.shop_name, id: items.sid}"></shop-title>
<view class="primary flex-none m-l-20">{{items.after_sale.type_text}}</view>
</view>
<view v-for="(item, index2) in items.order_goods" :key="index2">
<router-link :to="{path: '/bundle/pages/after_sales_detail/after_sales_detail',
query: { id: items.after_sale.after_sale_id,}}">
<view class="sale-content">
<view class="flex">
<view class="goods-img">
<u-image width="160rpx" height="160rpx" border-radius="6rpx" :src="item.image" />
</view>
<view class="goods-desc m-l-24">
<view class="goods-name line-2">{{item.goods_name}}</view>
<view class="m-t-10 xs line-1 muted">{{item.spec_value_str}}</view>
<view class="flex row-between m-t-20">
<price-format class="sm" :first-size="30" :second-size="30" :subscript-size="26"
:price="item.goods_price" />
<view>x{{item.goods_num}}</view>
</view>
</view>
</view>
<view class="sale-status m-t-20 flex">
<view class="bold">申请状态</view>
<view class="m-l-20">{{items.after_sale.desc}}</view>
</view>
</view>
</router-link>
<view class="sale-footer flex row-right">
<view class="row-center flex br60 m-r-20 btn black-btn"
@tap="onShowDialog(items.after_sale.after_sale_id)">
撤销申请
</view>
<router-link :to="{path: '/bundle/pages/apply_refund/apply_refund',
query: {
after_sale_id: items.after_sale.after_sale_id,
order_id: items.order_id,
item_id: item.item_id}}" v-if="items.after_sale.status == 4 || items.after_sale.status == 1">
<view class="row-center flex br60 m-r-20 btn primary">重新申请</view>
</router-link>
<router-link
:to="{path: '/bundle/pages/input_express_info/input_express_info', query: { id: items.after_sale.after_sale_id}}"
v-if="items.after_sale.status == 2">
<view class="row-center flex br60 m-r-20 btn black-btn">
填写快递单号
</view>
</router-link>
</view>
</view>
</view>
</view>
<view class="sale-list" v-else>
<view v-for="(items, index) in lists" :key="index" class="sale-item bg-white m-t-20">
<view class="sale-header flex row-between">
<shop-title :shop="{name: items.shop_name, id: items.sid}"></shop-title>
<view class="primary flex-none m-l-20">{{items.after_sale.type_text}}</view>
</view>
<view v-for="(item, index2) in items.order_goods" :key="index2">
<router-link :to="{path: '/bundle/pages/after_sales_detail/after_sales_detail',
query: { id: items.after_sale.after_sale_id,}}">
<view class="sale-content">
<view class="flex">
<view class="goods-img">
<u-image width="160rpx" height="160rpx" border-radius="6rpx" :src="item.image" />
</view>
<view class="goods-desc m-l-24">
<view class="goods-name line-2">{{item.goods_name}}</view>
<view class="m-t-10 line-1 muted">{{item.spec_value_str}}</view>
<view class="flex row-between m-t-20">
<price-format class="sm" :first-size="30" :second-size="30" :subscript-size="26"
:price="item.goods_price" />
<view>x{{item.goods_num}}</view>
</view>
</view>
</view>
<view class="sale-status m-t-20 flex">
<view class="bold">申请状态</view>
<view class="m-l-20">{{items.after_sale.desc}}</view>
</view>
</view>
</router-link>
</view>
</view>
</view>
<u-modal v-model="showDialog" confirm-text="确定" :showCancelButton="true" :confirm-color="colorConfig.primary"
@confirm="cancelApplyFun">
<view class="flex-col col-center tips-dialog" style="padding: 30rpx 0;">
<image class="icon-lg" :src="aliOSSDomain + 'uniapp/icon_warning.png'"></image>
<view class="m-t-30">是否要撤销申请?</view>
</view>
</u-modal>
</mescroll-uni>
</template>
<script>
import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
import {
afterSaleType
} from "@/utils/type";
import {
getAfterSaleList,
cancelApply,
afterSaleDetail,
applyAgain
} from "@/api/user";
import {
copy
} from '@/utils/tools'
export default {
mixins: [MescrollMixin, MescrollMoreItemMixin],
props: {
type: {
type: String,
default: afterSaleType.NORMAL
}
},
data() {
return {
lists: [],
downOption: {
auto: false
},
upOption: {
auto: false,
noMoreSize: 4,
empty: {
icon: 'https://zjeloong.oss-cn-hangzhou.aliyuncs.com/uniapp/order_null.png',
tip: '暂无售后~',
fixed: true
}
},
showDialog: false
};
},
created() {
uni.$on("refreshsale", () => {
this.downCallback()
})
},
destroyed() {
uni.$off("refreshsale")
},
methods: {
applyRefund(items, item) {
const {
after_sale: {
able_apply
},
order_id
} = items
const {
item_id
} = item
if (able_apply != 1) {
return
}
this.$Router.push({
path: '/bundle/pages/apply_refund/apply_refund',
query: {
order_id,
item_id
}
})
},
cancelApplyFun() {
cancelApply({
id: this.id
}).then(res => {
if (res.code == 1) {
this.$toast({
title: res.msg
});
uni.$emit("refreshsale")
}
});
},
async upCallback(page) {
const {
type,
} = this;
const params = {
page_size: page.size,
page_no: page.num,
type
}
const {
data,
code
} = await getAfterSaleList(params)
if (code == 1) {
const curPageData = data.list;
const curPageLen = curPageData.length;
const hasNext = !!data.more;
if (page.num == 1) this.lists = [];
this.lists = this.lists.concat(curPageData);
this.mescroll.endSuccess(curPageLen, hasNext);
}
},
onShowDialog(id) {
this.id = id;
this.showDialog = true
},
onCopy(order) {
copy(order)
}
}
};
</script>
<style lang="scss">
.sale-list {
overflow: hidden;
.sale-item {
.sale-header {
padding: 0 20rpx;
}
.sale-content {
padding: 20rpx 24rpx;
.sale-status {
padding: 20rpx 40rpx;
background-color: #F6F6F6;
border-radius: 6rpx;
}
.goods-desc {
min-width: 500rpx;
}
}
.kefu {
display: flex;
justify-content: flex-end;
align-items: center;
padding: 0 24rpx 22rpx;
}
.sale-footer {
padding: 0 24rpx 22rpx;
.btn {
padding: 9rpx 34rpx;
border: 1px solid $-color-primary;
&.gray-btn {
border-color: $-color-border;
color: $-color-muted;
}
&.black-btn {
border-color: $-color-border;
color: $-color-normal;
}
}
}
}
}
</style>