purchase-let/pagesOrder/order/order.vue

444 lines
11 KiB
Vue

<template>
<view class="wrap">
<up-navbar placeholder style="z-index: 100800;" @leftClick="navBack">
<template #center>
<view>订单</view>
</template>
</up-navbar>
<up-sticky bgColor="#fff">
<view style="padding: 10rpx 20rpx 0 20rpx;">
<up-search shape="round" v-model="keyword" @custom="searchOn" @search="searchOn" @clear="searchOn"
:actionStyle="{color: '#20b128'}"></up-search>
</view>
<up-tabs :current="tabsActive" :list="tablist" lineColor="#20b128" :scrollable="false"
:activeStyle=" { color: '#20b128', fontWeight: 'bold' }" @change="changeTab"></up-tabs>
</up-sticky>
<swiper class="swiper-box" :current="swiperCurrent" @animationfinish="animationfinish">
<swiper-item class="swiper-item" v-for="(list, k) in orderList" :key="k">
<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="loadMoreGood">
<view class="page-box">
<view v-if="list.length>0" class="list">
<good v-for="(item, index) in list" :datas="item" :key="index" :type="k"
@cancleOrder="cancleOrder" @takeOrder="takeOrder" @rePay="rePay"
@purchaseAgain="purchaseAgain" @applyAfterSales="applyAfterSales"></good>
</view>
<view v-if="!where[k].loading&&list.length==0" style="padding-top: 100rpx;">
<up-empty text="订单空空如也"
icon="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/29955202404260944367594.png">
</up-empty>
</view>
<view v-else-if="where[k].loadend" style="padding-top: 100rpx;">
<view style="text-align: center;color: #999;">没有更多了</view>
</view>
<view v-if="where[k].loading"
style="padding-top: 100rpx;display: flex;flex-direction: column;align-items: center;">
<up-loading-icon mode="circle"></up-loading-icon>
<view style="margin-top: 20rpx;color: #999;">加载中</view>
</view>
<view style="width: 100%;height: 300rpx;"></view>
</view>
</scroll-view>
</swiper-item>
</swiper>
</view>
<orderCanclePopup :show="showCancel" @close="showCancel=false" @change="submitCancel" />
<modal :show="showTake" title="确认收货" content="请确认您已收到货" @close="showTake=false" @change="confirmReceipt" />
<!-- 退款原因 -->
<up-popup :show="refundShow" closeable round="10" @close="close">
<view class="address-popup">
<view class="head-title">选择商品</view>
<view class="afterSales-type">
<view class="afterSales-type-title">售后类型</view>
<view class="afterSales-type-con">
<view class="afterSales-type-item">仅退款</view>
<view class="afterSales-type-item">退款退货</view>
<view class="afterSales-type-item">换货</view>
</view>
</view>
<scroll-view style="max-height: 50vh;padding-bottom: 20rpx;" scroll-y>
<block v-for="(item,index) in refundReasonList" :key="index">
<view class="row" @click="refundType = item.value">
<view class="content">
<view class="top"></view>
<view class="bottom u-line-2">{{item.value}}</view>
</view>
<image v-if="refundType==item.value" src="@/static/icon/check.png"></image>
<image v-else src="@/static/icon/n-check.png"></image>
</view>
</block>
</scroll-view>
<up-button color="#20B128" shape="circle" @click="onSubmitReason">提交</up-button>
</view>
</up-popup>
</template>
<script setup>
import {
onLoad,
onUnload
} from "@dcloudio/uni-app"
import {
ref
} from 'vue';
import good from "./component/good.vue";
import orderCanclePopup from "@/components/orderCanclePopup.vue"
import modal from "@/components/modal.vue"
import {
cancelOrderApi,
rePaymentApi,
confirmReceiptApi,
orderListApi,
purchaseAgainApi
} from "@/api/order.js"
const tabsActive = ref(0)
const changeTab = ({
index
}) => {
tabsActive.value = index;
swiperCurrent.value = index;
}
const tablist = ref([{
name: '全部'
}, {
name: '待付款'
}, {
name: '待核销'
}, {
name: '已核销'
}, {
name: '退款/售后'
}]);
const swiperCurrent = ref(0);
const animationfinish = ({
detail: {
current
}
}) => {
swiperCurrent.value = current;
tabsActive.value = current;
if (swiperCurrent.value == 0 && orderList.value[0].length == 0) getOrderList(0, '', ''); //全部
if (swiperCurrent.value == 1 && orderList.value[1].length == 0) getOrderList(1, '', 0); //代付款
if (swiperCurrent.value == 2 && orderList.value[2].length == 0) getOrderList(2, 1, 1); //待核销
if (swiperCurrent.value == 3 && orderList.value[3].length == 0) getOrderList(3, 2, 1); //已核销
if (swiperCurrent.value == 4 && orderList.value[4].length == 0) getOrderList(2, -1, 1); //退款
}
// 取消订单
const showCancel = ref(false);
let cancelId = '';
const submitCancel = (e) => {
showCancel.value = false;
cancelOrderApi({
order_id: cancelId,
value: e.value
}).then(res => {
uni.showToast({
title: '取消成功',
icon: 'none'
})
orderList.value[1] = orderList.value[1].filter(item => item.id !== cancelId)
})
}
// 取消订单
const cancleOrder = (e) => {
cancelId = e.id;
showCancel.value = true;
}
// 确认收货
const showTake = ref(false);
let takeId = "";
const takeOrder = (e) => {
takeId = e.id;
showTake.value = true;
}
// 确认收货
const confirmReceipt = () => {
confirmReceiptApi({
order_id: takeId
}).then(res => {
showTake.value = false;
uni.$u.toast('确认收货成功');
reloadAll();
})
}
// 再次购买
const purchaseAgain = (e) => {
purchaseAgainApi({
order_id: e.id
}).then(res => {
uni.$u.toast('已加入购物车');
uni.navigateTo({
url: '/pages/cart/cart'
})
})
}
const refundShow = ref(true);
// 申请售后
const applyAfterSales = (item) => {
uni.navigateTo({
url: "/pages/afterSales/afterSales",
success(res) {
res.eventChannel.emit('orderDetail', item)
}
})
}
const rePay = (e) => {
rePaymentApi({
order_id: e.id,
address_id: e.address_id,
mer_id: e.merchant,
pay_type: 1
}).then(res => {
if (!res.data?.nonceStr) return uni.$u.toast('支付失败!');
uni.requestPayment({
provider: 'wxpay',
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success: (e) => {
if (e.errMsg == 'requestPayment:ok') {
uni.showToast({
title: '订单支付成功',
icon: 'success'
})
reloadAll();
} else uni.$u.toast('支付失败')
},
fail: (e) => {
uni.$u.toast('用户取消支付')
}
})
}).catch(err => {
uni.$u.toast('网络错误')
})
}
// 订单
const where = ref([{
page_no: 1,
page_size: 25,
loading: false,
loadend: false
}, {
page_no: 1,
page_size: 25,
loading: false,
loadend: false
},
{
page_no: 1,
page_size: 25,
loading: false,
loadend: false
},
{
page_no: 1,
page_size: 25,
loading: false,
loadend: false
},
{
page_no: 1,
page_size: 25,
loading: false,
loadend: false
}
])
const keyword = ref('')
const orderList = ref([
[],
[],
[],
[],
[]
])
const getOrderList = (type = 0, status = '', paid = 1) => {
if (where.value[type].loadend) return;
where.value[type].loading = true;
orderListApi({
page_no: where.value[type].page_no,
page_size: where.value[type].page_size,
order_id: keyword.value,
status: status,
paid: paid
}).then(res => {
if (where.value[type].page_no == 1) orderList.value[type] = [];
orderList.value[type] = [...orderList.value[type], ...res.data.lists];
if (res.data.lists.length < where.value[type].page_size) where.value[type].loadend = true;
where.value[type].page_no++;
where.value[type].loading = false;
}).catch(err => {
where.value[type].loading = false;
})
}
const loadMoreGood = () => {
if (swiperCurrent.value == 0) getOrderList(0, '', ''); //全部
if (swiperCurrent.value == 1) getOrderList(1, '', 0); //代付款
if (swiperCurrent.value == 2) getOrderList(2, 1, 1); //待核销
if (swiperCurrent.value == 3) getOrderList(3, 2, 1); //已核销
if (swiperCurrent.value == 4) getOrderList(2, -1, 1); //退款
}
// 搜索
const searchOn = () => {
orderList.value[+swiperCurrent.value] = [];
where.value[+swiperCurrent.value].page_no = 1;
where.value[+swiperCurrent.value].loadend = false;
if (swiperCurrent.value == 0) getOrderList(0, '', ''); //全部
if (swiperCurrent.value == 1) getOrderList(1, '', 0); //代付款
if (swiperCurrent.value == 2) getOrderList(2, 1, 1); //待核销
if (swiperCurrent.value == 3) getOrderList(3, 2, 1); //已核销
if (swiperCurrent.value == 4) getOrderList(2, -1, 1); //退款
}
let back = 0;
const navBack = () => {
uni.navigateBack({
delta: back ? +back : 0
})
}
const reloadAll = () => { //对订单进行操作时刷新页面
where.value.forEach(item => {
item.page_no = 1;
item.loadend = false;
});
getOrderList(0, '', ''); //全部
getOrderList(1, '', 0); //代付款
getOrderList(2, 1, 1); //待核销
getOrderList(3, 2, 1); //已核销
getOrderList(2, -1, 1); //退款
}
onLoad((options) => {
if (options.type) {
tabsActive.value = +options.type;
swiperCurrent.value = +options.type;
searchOn();
}
if (options.back) back = options.back;
uni.$on('reLoadOrderList', reloadAll);
})
onUnload(() => {
uni.$off('reLoadOrderList', reloadAll)
})
</script>
<style lang="scss">
.wrap {
display: flex;
flex-direction: column;
height: calc(100vh - var(--window-top));
width: 100%;
}
.swiper-box {
flex: 1;
}
.swiper-item {
height: 100%;
}
.page-box {
margin: 20rpx;
}
.address-popup {
padding: 30rpx;
.head-title {
font-weight: bold;
text-align: center;
margin-bottom: 20rpx;
}
.list-admin {
display: flex;
justify-content: space-between;
margin-bottom: 20rpx;
.admin-btn {
display: flex;
color: #20B128;
.btn {
margin-left: 20rpx;
display: flex;
align-items: center;
&:active {
color: rgba(#20B128, 0.8);
transition: background-color 0.5s;
animation: disappear 0.5s 0.5s forwards;
}
}
}
}
.row {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #f6f6f6;
margin-bottom: 20rpx;
&:last-child {
border-bottom: none;
margin-bottom: 0;
}
.content {
.top {
display: flex;
view {
margin-right: 20rpx;
}
}
.bottom {}
}
image {
width: 40rpx;
height: 40rpx;
flex-shrink: 0;
}
}
}
@keyframes disappear {
to {
opacity: 0;
/* 渐隐 */
transform: scale(0);
/* 缩小 */
}
}
</style>