|
|
<template> <view> <!-- tabs选项卡 --> <view class="lf-flex"> <view style="width: 84%;"> <u-tabs :current="tabIndex" :list="tabList" :lineWidth="34" :scrollable="false" :itemWidth="100 / tabList.length +'%'" lineColor="#E7A23F" @change="switchTab" > </u-tabs> </view> <view class="filter-icon"> <image src="@/static/icon/filter.png" @click="showFilter = !showFilter"></image> </view> </view> <!-- 筛选 --> <view class="filter-box" v-if="showFilter"> <view class="flex-col group_6" > <view class="flex-col section_5"> <view class="flex-col"> <text class="text_7">按收货确认时间</text> <view class="flex-col group_8"> <view class="lf-flex lf-flex-wrap"> <view class="filter-date-item" :class="{active: filterGather.date == item.value}" @click="selectReceivingTime(item)" v-for="(item, index) in receivingTimeList" :key="index">{{ item.label }}</view> </view> </view> </view> <view class="flex-col group_13"> <text class="text_18">按送评信息</text> <view class="flex-col items-start text-wrapper_4"> <u-input v-model="filterGather.name" placeholder="输入送评人姓名或手机号" class="text-wrapper_4-input"></u-input> </view> </view> <view class="flex-col group_13"> <text class="text_18">按送评信息</text> <view class="flex-col items-start text-wrapper_4"> <u-input v-model="filterGather.order_num" placeholder="输入评级编号" class="text-wrapper_4-input" ></u-input> </view> </view> <view class="flex-row group_14"> <view class="flex-col items-center text-wrapper_5" @click="reset"> <text>重置</text> </view> <view class="flex-col items-center text-wrapper_6" @click="confirm"> <text>确认</text> </view> </view> </view> <view class="flex-col items-center group_15" @click="showFilter = false"> <view class="section_7"> </view> </view> </view> </view> <!-- 页面主体滚动区域 --> <swiper :current="tabIndex" :style="{height: swiperContentHeight}" @change="swiperChange"> <swiper-item v-for="(tabItem, idx) in tabList" :key="idx" :item-id="tabItem.ident"> <scroll-view :style="{height: swiperContentHeight, 'padding-top': '30rpx'}" :scroll-y="true" :refresher-enabled="true" :refresher-triggered="tabItem.isRefresher" @scrolltolower="scrolltolower" @refresherrefresh="refresherrefresh" > <view class="item-box" v-for="(item, index) in tabItem.data" :key="index" @click="$url('/packages/sonpingDetail/sonpingDetail?id='+ item.id)"> <view class="flex-col section_5"> <view class="justify-between"> <view class="flex-row group_8"> <image :src="showOrderStatusIcon(item.status)" class="image_7" /> <text class="text_7">{{ ['在线送评','确认收货','定价','发货','已确认'][item.status-1] }}</text> </view> <text class="text_8" :style="{color: item.status_text_color}">{{ item.status_text }}</text> </view> <view class="justify-between group_9"> <view class="flex-row"> <text>{{ item.owner }}</text> <text class="text_10">{{ item.tel }}</text> </view> <text>共{{ item.num }}件</text> </view> <view class="justify-between group_11"> <!-- <text class="text_12">更多</text> --> <text class="text_12"></text> <view class="flex-row" v-if="item.status == 1"> <view class="flex-col items-center text-wrapper" @click.stop="orderCancel(item)"> <text>取消</text> </view> <view v-if="!item.express_numb && !item.express_type" class="flex-col items-center text-wrapper_1" @click.stop="orderSend(item)"> <text>寄送藏品</text> </view> </view> <view class="flex-row" v-else-if="item.status == 2"> <view class="flex-col items-center text-wrapper" @click.stop="clickIndex = index, $url('/packages/address/address?is_select=1')"> <text>更改地址</text> </view> </view> <view class="flex-row" v-else-if="item.status == 3"> <view class="flex-col items-center text-wrapper_1" style="border-color: #EA2B2B; color: #EA2B2B;" @click.stop="orderPay(item)"> <text>付款</text> </view> </view> <view class="flex-row" v-else-if="item.status == 4"> <view class="flex-col items-center text-wrapper_1" @click.stop="orderConfirm(item)"> <text>确认收货</text> </view> </view> </view> </view> </view> <!-- 当前tab下没有数据且无分页数据时,显示系统剪辑中 --> <view class="nomore-box" v-if="tabItem.data.length <= 0 && !tabItem.isPage"> <image src="@/static/images/nomore.png"></image> <view>暂无订单记录</view> </view> <!-- 加载中和暂无更多显示 --> <u-loadmore :status="tabItem.status" margin-bottom="20" marginTop="20" v-else></u-loadmore> <!-- 底部修饰,解决部分机型底部被挡住且padding和margin都不生效的BUG --> <view class="additional"></view> </scroll-view> </swiper-item> </swiper> <!-- 轻提示 --> <u-toast ref="uToast"></u-toast> </view></template>
<script> import { orderList, cancelOrder, confirmOrder, doPay, changOrderAddress } from '@/service/order.js'; import orderStatus1 from '@/static/icon/order_status1.png'; import orderStatus2 from '@/static/icon/order_status2.png'; import orderStatus3 from '@/static/icon/order_status3.png'; import orderStatus4 from '@/static/icon/order_status4.png'; import orderStatus5 from '@/static/icon/order_status5.png'; export default { data(){ let publicKey = { page: 1, pageSize: 10, isPage: true, status: 'loading', // loading加载,nomore没有更多了
isRefresher: false, // 下拉刷新状态,默认没有开启下拉
} return { showFilter: false, tabList: [{ name: '全部', ident: 'all', type: 0, data: [], badge: {isDot: false}, requestFunction: 'getList', ...publicKey },{ name: '待确认', ident: 'waitconfirm', type: 1, data: [], badge: {isDot: false}, requestFunction: 'getList', ...publicKey },{ name: '评级中', ident: 'gradeing', type: 2, data: [], badge: {isDot: false}, requestFunction: 'getList', ...publicKey },{ name: '待付款', ident: 'waitpay', type: 3, data: [], badge: {isDot: false}, requestFunction: 'getList', ...publicKey },{ name: '待收货', ident: 'waitreceiv', type: 4, data: [], badge: {isDot: false}, requestFunction: 'getList', ...publicKey }], tabIndex: 0, receivingTimeList: [{ label: '1个月内', value: '1' },{ label: '3个月内', value: '2' },{ label: '6个月内', value: '3' },{ label: '今年', value: '4' },{ label: '2021年', value: '5' },{ label: '2020年', value: '6' },{ label: '2019年', value: '7' }], filterGather: { date: '', name: '', label: '', order_num: '' }, clickButton: false, address: {}, clickIndex: 0 } }, computed: { // 传入对应tab的ident值,在当前tabIndex下是否匹配,匹配上返回true,否则返回false,调用matchTabIdent(par1, par2, ...)
matchTabIdent(){ let that = this; return function(){ let identList = Array.from(arguments); let hasKey = identList.some(item => that.tabList[that.tabIndex].ident === item); return hasKey; } }, // 计算获得swiper内容区域剩余高度
swiperContentHeight(){ return `calc(100vh - 80rpx - 10rpx)`; }, showOrderStatusIcon(){ return function(status){ return [orderStatus1, orderStatus2, orderStatus3, orderStatus4, orderStatus5][status-1] } } }, watch: { address(){ this.orderAddressChange(); } }, onLoad(options){ this.tabIndex = Number(options.current || this.tabIndex); this[ this.tabList[this.tabIndex].requestFunction ](); // 获取当前tab下的数据列表
}, methods: { // 获取数据
getList(options = {}){ let tabItem = this.tabList[this.tabIndex]; let filterGather = this.filterGather; let data = { type: tabItem.type, page: tabItem.page, pageSize: tabItem.pageSize }; if(filterGather.date){ data.confirm_type = filterGather.date; } if(filterGather.name){ data.name_phone = filterGather.name; } if(filterGather.label){ data.label = filterGather.label; } if(filterGather.order_num){ data.order_num = filterGather.order_num; } orderList(data).then(res => { let datas = res.data.datas; let isPage = this.$isRight(datas.next_page_url); if(!isPage){ tabItem.isPage = isPage; tabItem.status = 'nomore'; } if(tabItem.page == 1){ tabItem.data = datas.data; }else{ tabItem.data.push(...datas.data); } if(options.refresher){ this.$refs.uToast.show({ message: '刷新成功', type: 'success' }); tabItem.isRefresher = false; } }) }, // 筛选
confirm(){ this.tabIndex = 0; let tabItem = this.tabList[this.tabIndex]; tabItem.page = 1; tabItem.isPage = true; tabItem.status = 'loading'; tabItem.data = []; this[tabItem.requestFunction](); this.showFilter = false; }, // 重置筛选条件
reset(){ this.filterGather = this.$options.data().filterGather; this.$refs.uToast.show({ message: '内容已重置', type: 'success' }); }, // 选择确认收货时间
selectReceivingTime(item){ if(this.filterGather.date == item.value){ this.filterGather.date = ""; }else{ this.filterGather.date = item.value; } }, // 取消订单
orderCancel(item){ uni.showModal({ title: '提示', content: '真要取消该订单吗?', success: async result => { if(result.confirm){ await cancelOrder(item.order_id); this.$refs.uToast.show({ message: '取消成功', type: 'success' }); this.confirm(); } } }) }, // 寄送藏品
orderSend(item){ let base_data = encodeURIComponent(JSON.stringify(item)); this.$url('/pages/write/distribution?base_data='+ base_data); }, // 更改地址
async orderAddressChange(){ let order_id = this.tabList[this.tabIndex].data[this.clickIndex].order_id; await changOrderAddress({order_id: order_id, addr_id: this.address.id}); this.$refs.uToast.show({ message: '地址修改成功', type: 'success' }); }, // 订单付款
orderPay(item){ if(this.clickButton) return; this.clickButton = true; doPay(item.order_id).then(res => { console.log("----------------", res); let datas = res.data.datas; uni.requestPayment({ provider: 'wxpay', timeStamp: datas.timeStamp, nonceStr: datas.nonceStr, package: datas.package, signType: datas.signType, paySign: datas.paySign, success: res => { this.clickButton = false; this.$refs.uToast.show({ message: '支付成功', type: 'success' }); this.confirm(); }, fail: err => { uni.showModal({ title: '', content: 'fail:' + JSON.stringify(err) + '支付失败', showCancel: false }) this.clickButton = false; } }) }).catch(err => this.clickButton = false) }, // 确认收货
async orderConfirm(item){ uni.showModal({ title:"确认收货", content:'确认收到货物并签收?', success:async (e) => { if(e.confirm){ await confirmOrder(item.id); this.$refs.uToast.show({ message: '确认收货成功', type: 'success' }); this.confirm(); } } }); }, // 切换tab
switchTab(item){ this.tabIndex = item.index; // 判断所切换到的tab下是否有数据并且isPage为true,如果没有再请求,否则啥也不干
let tabItem = this.tabList[this.tabIndex]; if(tabItem.data.length === 0 && tabItem.isPage){ this[ tabItem.requestFunction ](); } }, // swiper滑动响应事件
swiperChange(event){ // 事件触发类型为触摸时才做处理,否则是因为switchTab方法执行导致的事件回调
if(event.detail.source === 'touch'){ this.tabIndex = event.detail.current; // 判断所切换到的tab下是否有数据并且isPage为true,如果没有再请求,否则啥也不干
let tabItem = this.tabList[this.tabIndex]; if(tabItem.data.length === 0 && tabItem.isPage){ this[ tabItem.requestFunction ](); } } }, // 下拉刷新,重新获取页面数据,将状态置回初始值再请求
refresherrefresh(){ let tabItem = this.tabList[this.tabIndex]; tabItem.isRefresher = true; tabItem.page = 1; tabItem.isPage = true; tabItem.status = 'loading'; tabItem.data = []; this[tabItem.requestFunction]({refresher: true}); }, // 滚动到底部
scrolltolower(){ let tabItem = this.tabList[this.tabIndex]; if(tabItem.isPage){ tabItem.page++; this[tabItem.requestFunction](); } } } }</script>
<style> /* 修复ios页面左右漂浮BUG */ page{ overflow: hidden; }</style><style scoped lang="scss"> .filter-icon{ width: 16%; height: 34rpx; display: flex; justify-content: center; align-items: center; border-left: 2rpx solid #F6F6F6; image{ width: 36rpx; height: 32rpx; } } .filter-box{ position: absolute; z-index: 9999; width: 750rpx; .text-wrapper_1 { margin-left: 16rpx; flex: 1 1 160rpx; color: rgb(51, 51, 51); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; padding: 14rpx 0; background-color: rgb(246, 246, 246); border-radius: 10rpx; height: 68rpx; } .left-text-wrapper { padding: 14rpx 0; background-color: rgb(246, 246, 246); border-radius: 10rpx; width: 160rpx; height: 68rpx; } .group_6 { padding-top: 2rpx; } .section_5 { padding: 40rpx 32rpx 50rpx; background-color: rgb(255, 255, 255); } .group_15 { padding: 506rpx 0 16rpx; position: relative; } .group_11 { margin-top: 50rpx; } .group_13 { margin-top: 50rpx; } .group_14 { margin-top: 50rpx; } .section_7 { background-color: rgba(0, 0, 0, 0.5); width: 750rpx; height: 528rpx; top: 0; right: 0; bottom: 0; left: 0; position: absolute; } .text_7 { color: rgb(51, 51, 51); font-size: 32rpx; font-weight: 500; line-height: 44rpx; white-space: nowrap; } .group_8 { margin-top: 20rpx; } .text_15 { color: rgb(51, 51, 51); font-size: 32rpx; font-weight: 500; line-height: 44rpx; white-space: nowrap; } .group_12 { margin-top: 20rpx; color: rgb(195, 195, 195); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; } .text_18 { color: rgb(51, 51, 51); font-size: 32rpx; font-weight: 500; line-height: 44rpx; white-space: nowrap; } .text-wrapper_4 { margin-top: 18rpx; // padding: 12rpx 0;
color: rgb(195, 195, 195); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; border-radius: 10rpx; border: solid 2rpx rgb(195, 195, 195); /deep/.u-input{ width: 100%; } } .text-wrapper_5 { padding: 24rpx 0; flex: 1 1 330rpx; color: rgb(195, 195, 195); font-size: 32rpx; font-weight: 600; line-height: 44rpx; white-space: nowrap; border-radius: 10rpx; height: 96rpx; border: solid 2rpx rgb(195, 195, 195); } .text-wrapper_6 { margin-left: 26rpx; padding: 26rpx 0; flex: 1 1 330rpx; color: rgb(255, 255, 255); font-size: 32rpx; font-weight: 600; line-height: 44rpx; white-space: nowrap; background-color: rgb(231, 162, 63); border-radius: 10rpx; height: 96rpx; } .group_10 { margin-top: 20rpx; color: rgb(51, 51, 51); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; } .text-wrapper_2 { // padding: 12rpx 0;
flex: 1 1 auto; border-radius: 10rpx; height: 68rpx; border: solid 2rpx rgb(195, 195, 195); } .text-wrapper_3 { margin-left: 28rpx; // padding: 12rpx 0;
border-radius: 10rpx; width: 308rpx; height: 68rpx; border: solid 2rpx rgb(195, 195, 195); } .text_19 { margin-left: 18rpx; } .text-wrapper { padding: 14rpx 0; flex: 1 1 160rpx; color: rgb(255, 255, 255); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; background-color: rgb(231, 162, 63); border-radius: 10rpx; height: 68rpx; } .view_3 { margin-left: 14rpx; } .view_6 { margin-left: 16rpx; } .view_7 { margin-left: 14rpx; } .text_17 { margin-left: 18rpx; } } .item-box{ width: 686rpx; // height: 300rpx;
margin: 0 auto; background-color: #f6f6f6; &:nth-child(n+2){ margin-top: 20rpx; } .section_5 { padding: 40rpx 32rpx 0; background-color: rgb(255, 255, 255); } .group_9 { margin-top: 30rpx; color: rgb(51, 51, 51); font-size: 32rpx; font-weight: 500; line-height: 44rpx; white-space: nowrap; } .group_11 { margin-top: 26rpx; padding: 32rpx 0 28rpx; border-top: solid 2rpx rgb(239, 239, 239); } .group_8 { color: rgb(153, 153, 153); font-size: 28rpx; line-height: 40rpx; white-space: nowrap; } .text_8 { color: rgb(43, 102, 234); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; } .text_12 { align-self: center; color: rgb(153, 153, 153); font-size: 28rpx; line-height: 40rpx; white-space: nowrap; } .image_7 { width: 40rpx; height: 40rpx; } .text_7 { margin-left: 12rpx; } .text_10 { margin-left: 21rpx; } .text-wrapper { padding: 10rpx 0; color: rgb(153, 153, 153); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; border-radius: 32rpx; width: 160rpx; height: 64rpx; border: solid 2rpx rgb(153, 153, 153); } .text-wrapper_1 { margin-left: 18rpx; padding: 10rpx 0; color: rgb(231, 162, 63); font-size: 28rpx; font-weight: 500; line-height: 40rpx; white-space: nowrap; border-radius: 32rpx; width: 160rpx; height: 64rpx; border: solid 2rpx rgb(231, 162, 63); } } .nomore-box{ width: 686rpx; height: 500rpx; margin: 0 auto; display: flex; flex-direction: column; justify-content: center; align-items: center; image{ width: 434rpx; height: 260rpx; } view{ text-align: center; color: #777777; margin-top: 40rpx; } } // 解决scroll-view底部padding和margin都不生效贴边的BUG
.additional{ height: calc( env(safe-area-inset-bottom) + 20rpx ); height: calc( constant(safe-area-inset-bottom) + 20rpx ); } .filter-date-item{ width: 160rpx; height: 68rpx; background: #F6F6F6; border-radius: 10rpx; font-size: 28rpx; color: #333333; margin-right: 16rpx; display: flex; justify-content: center; align-items: center; &:nth-child(4n){ margin-right: 0rpx; } &:nth-child(n+5){ margin-top: 16rpx; } &.active{ color: #FFFFFF; background-color: #E7A23F; } }</style>
|