220 lines
6.6 KiB
Vue
220 lines
6.6 KiB
Vue
<template>
|
|
<view>
|
|
<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"
|
|
@rePay="rePay"></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: 200rpx;"></view>
|
|
</view>
|
|
</scroll-view>
|
|
</swiper-item>
|
|
</swiper>
|
|
<orderCanclePopup :show="showCancel" @close="showCancel=false" @change="submitCancel" />
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { onLoad } from "@dcloudio/uni-app"
|
|
import { ref } from 'vue';
|
|
import good from "./component/good.vue";
|
|
import orderCanclePopup from "@/components/orderCanclePopup.vue"
|
|
import { orderListApi } from "@/api/order.js";
|
|
import { cancelOrderApi, rePaymentApi } from "@/api/order.js"
|
|
|
|
const tabsActive = ref(0)
|
|
const changeTab = ({ index }) => {
|
|
tabsActive.value = index;
|
|
swiperCurrent.value = index;
|
|
}
|
|
const tablist = ref([
|
|
{ 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, 0);
|
|
}
|
|
|
|
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 rePay = (e) => {
|
|
rePaymentApi({
|
|
order_id: e.id,
|
|
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'
|
|
})
|
|
getOrderList(1, '', 0);
|
|
} 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
|
|
}
|
|
])
|
|
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,
|
|
keyword: 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, 0);
|
|
}
|
|
|
|
// 搜索
|
|
const searchOn = () => {
|
|
orderList.value[+swiperCurrent.value] = [];
|
|
where.value[+swiperCurrent.value].page_no = 1;
|
|
if (swiperCurrent.value == 0) getOrderList(0);
|
|
if (swiperCurrent.value == 1) getOrderList(1, '', 0);
|
|
if (swiperCurrent.value == 2) getOrderList(2, 0);
|
|
}
|
|
|
|
onLoad((options) => {
|
|
if (options.type) {
|
|
tabsActive.value = +options.type;
|
|
swiperCurrent.value = +options.type;
|
|
searchOn();
|
|
}
|
|
// getOrderList(0);
|
|
// getOrderList(1, '', 0);
|
|
// getOrderList(2, 0);
|
|
|
|
uni.$on('reLoadOrderList', () => { //对订单进行操作时刷新页面
|
|
where.value.forEach(item=>item.page_no=1);
|
|
getOrderList(1, '', 0);
|
|
getOrderList(0);
|
|
getOrderList(2, 0);
|
|
});
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.swiper-box {
|
|
flex: 1;
|
|
height: calc(100vh - var(--window-top) - 140rpx);
|
|
/* #ifdef H5 */
|
|
height: calc(100vh - 210rpx);
|
|
/* #endif */
|
|
width: 100%;
|
|
|
|
.swiper-item {
|
|
height: 100%;
|
|
// background-color: pink;
|
|
}
|
|
}
|
|
|
|
.page-box {
|
|
margin: 20rpx;
|
|
|
|
.list {}
|
|
}
|
|
</style> |