zhwl-miniapp/pages/my/myOrder.vue
2025-06-26 12:38:35 +08:00

368 lines
18 KiB
Vue

<template>
<view class="uni-container">
<u-navbar :autoBack="true" :bgColor="bgColor">
<view slot='center' style="font-size: 36rpx; font-weight: bold;">
票务订单
</view>
</u-navbar>
<view class="menu" :style="'top: ' + navHeight + 'px;'">
<view :class="{ active: menuIndex === '' }" @click="tabMenu('')">全部</view>
<view :class="{ active: menuIndex === '0' }" @click="tabMenu('0')">待付款</view>
<view :class="{ active: menuIndex === '1' }" @click="tabMenu('1')">待使用</view>
<view :class="{ active: menuIndex === '2' }" @click="tabMenu('2')">已核销</view>
<view :class="{ active: menuIndex === '3' }" @click="tabMenu('3')">退款</view>
</view>
<mescroll-body @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption" :top="paddingTop + 'px'">
<view class="list_waper" v-if="menuIndex < 3">
<navigator hover-class="none" class="list" v-for="(item, index) in list " :key="index" :url="'/pages/my/unpaid?id=' + item.id">
<view class="title">
<view class="text">订单编号:{{item.orderCode}}</view>
<view class="status" :style="{'color': getStatusColor(item)}">{{getStatusName(item)}}</view>
</view>
<view class="info" v-if="item.orderItemList">
<view class="img">
<image :src="$utils.setImgUrl(item.orderItemList[0].image11)" mode=""></image>
</view>
<view class="cont">
<view class="col col1">{{item.orderItemList[0].ticketName}}</view>
<view class="col col2">下单:{{item.createTime}}</view>
<view class="col col3" v-if="item.orderItemList[0].ticketOrderDetailList[0].availableStartTime && item.orderItemList[0].ticketOrderDetailList[0].availableEndTime">
<template v-if="item.orderItemList[0].ticketOrderDetailList[0].availableStartTime.split(' ')[0] == item.orderItemList[0].ticketOrderDetailList[0].availableEndTime.split(' ')[0]">
<text>{{item.orderItemList[0].ticketOrderDetailList[0].availableStartTime.split(' ')[0]}}</text>
当日有效
</template>
<template v-else>
<text>{{item.orderItemList[0].ticketOrderDetailList[0].availableStartTime.split(' ')[0]}}</text>
<text>{{item.orderItemList[0].ticketOrderDetailList[0].availableEndTime.split(' ')[0]}}</text>
有效
</template>
</view>
<view class="col col3" v-else>
{{item.orderItemList[0].ticketValidityPeriod == '2' ? '购买后' : '激活后'}}{{item.orderItemList[0].buyPeriodDay}}天有效
</view>
<view class="price">
<view>¥{{item.orderItemList[0].totalPrice}}</view>
<view>共{{item.orderItemList[0].buyQuantity}}张</view>
</view>
</view>
</view>
<view class="btns" v-if="item.paymentType == '0' || item.showRefund">
<view class="btn default" v-if="item.paymentType == '0'" @click.stop="cancelOrder(item.orderCode)">取消订单</view>
<view class="btn active" v-if="item.paymentType == '0'" @click.stop="payOrder(item)">立即支付</view>
<view class="btn default" v-if="item.showRefund" @click.stop="goRefund(item)">申请退款</view>
</view>
</navigator>
</view>
<view class="list_waper" v-else>
<navigator hover-class="none" class="list" v-for="(item, index) in list " :key="index" :url="'/pages/my/refundDetail?id=' + item.id">
<view class="title">
<view class="text">退款编号:{{item.refundCode}}</view>
<view class="status" :style="'color: ' + ((item.refundStatus == '2' || item.refundStatus == '200') ? '#03AE80' : '#FF5833')">{{item.refundStatusName}}</view>
</view>
<view class="info" v-if="item.orderRefundItemList">
<view class="img">
<image :src="$utils.setImgUrl(item.orderRefundItemList[0].zdyTicket.image11)" mode=""></image>
</view>
<view class="cont">
<view class="col col1">{{item.orderRefundItemList[0].ticketName}}</view>
<view class="col col2">下单:{{item.orderTime}}</view>
<view class="col col3">申请:{{item.createTime}}</view>
<view class="price">
<view>¥{{item.orderRefundItemList[0].totalPrice}}</view>
<view>共{{item.orderRefundItemList[0].refundQuantity}}张</view>
</view>
</view>
</view>
</navigator>
</view>
</mescroll-body>
</view>
</template>
<script>
import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
export default {
mixins: [MescrollMixin],
data () {
return {
navHeight: 0,
paddingTop: 0,
bgColor: '#fff',
menuIndex: '',
list: [],
downOption: { auto: false }
}
},
onLoad (options) {
if (options.index) this.menuIndex = options.index;
this.navHeight = this.$paddingTop;
this.paddingTop = this.$paddingTop + uni.upx2px(105);
},
onShow () {
this.mescroll && this.mescroll.resetUpScroll();
},
methods: {
getStatusName (item) {
let str = '';
if (item.paymentType <= '2') {// 状态大于2代表已支付
str = item.paymentTypeName;
} else {
if (item.refundStatus == 0) {
str = item.verificationTypeName;
} else {
str = item.refundStatusName;
}
}
return str;
},
getStatusColor(item) {
let color = '';
if (item.paymentType <= '2') {// 状态大于2代表已支付
color = item.paymentType == '0' ? '#FF5833' : '#999999'
} else {
if (item.refundStatus == 0) {
color = item.verificationType == '0' ? '#03AE80' : '#999999'
} else {
color = '#999999'
}
}
return color;
},
async cancelOrder (orderCode) {
let info = await this.$http.cancelTicketOrderPrepay(orderCode);
if (info.code == 200) {
uni.showToast({ mask: true, title: '操作成功', icon: 'success' })
this.mescroll.resetUpScroll();
} else uni.showToast({ mask: true, title: info.msg, icon: 'none' })
},
async payOrder (item) {
let parmas = {
orderItemList: [{
ticketName: item.orderItemList[0].ticketName,
totalPrice: item.orderItemList[0].totalPrice
}],
id: item.id
};
uni.navigateTo({
url: `/pages/my/payment?parmas=${JSON.stringify(parmas)}`
})
// if (item.paymentMethod == '7') {
// let info = await this.$http.continuePayment(item.id);
// if (info.code == 200) {
// uni.showToast({ mask: true, title: '支付成功', icon: 'success' });
// this.mescroll.resetUpScroll();
// }
// } else {
// let info = await this.$http.getTicketOrderSession({ orderId: item.id });
// uni.showLoading({ mask: true });
// const prepayId = JSON.parse(info.msg);
// uni.requestPayment({
// provider: 'wxpay',
// timeStamp: prepayId.timeStamp,
// nonceStr: prepayId.nonceStr,
// package: prepayId.packageValue,
// signType: prepayId.signType,
// paySign: prepayId.paySign,
// success: (res) => {
// uni.hideLoading();
// this.mescroll.resetUpScroll();
// },
// fail: (err) => {
// uni.hideLoading();
// uni.showToast({ mask: true, title: '支付取消', icon: 'none' })
// }
// });
// }
},
goRefund(e) {
uni.navigateTo({
url: `/pages/my/refund?id=${e.id}`
})
},
tabMenu (index) {
this.menuIndex = index;
this.list = [];
this.mescroll.resetUpScroll();
},
async upCallback (page) {
let obj = { pageNum: page.num, pageSize: page.size };
let info = null;
if (this.menuIndex == '3') {
info = await this.$http.getRefundList(obj);
} else {
if (this.menuIndex !== '') {
switch (this.menuIndex) {
case '0':
obj.paymentType = '0';
break;
case '1':
obj.paymentType = '200';
obj.verificationType = '0';
break;
case '2':
obj.verificationType = '200';
break;
}
}
info = await this.$http.getTicketOrderPrepay(obj);
}
if(page.num == 1) this.list = [];
// 判断是否包含可退票的门票
if (this.menuIndex != '3') {
info.rows.forEach((waper, waperIndex) => {
if (waper.orderItemList[0].totalPrice > 0) {
let list = [];
waper.orderItemList[0].ticketOrderDetailList.forEach((item, itemIndex) => {
if (waper.orderItemList[0].refundRule != '0' && item.paymentType == '200' && item.verificationType == '0' && (item.refundStatus == '0' || item.refundStatus == '100')) {
if (item.verificationMun == 0) {
let creaetd = parseInt(new Date(this.$utils.formatDate('Y-M-D', item.paymentTime) + ' 00:00:00').getTime() / 1000);
if (waper.orderItemList[0].classify == '1') {// 普通票
// 判断是否再有效期
switch (waper.orderItemList[0].refundRule) {
case '3':// 有效期可退
// let startTime = parseInt(new Date(this.$utils.formatDate('Y-M-D', item.availableStartTime) + ' 00:00:00').getTime() / 1000);
let endTime = parseInt(new Date(this.$utils.formatDate('Y-M-D', item.availableEndTime) + ' 23:59:59').getTime() / 1000);
let nowdate = parseInt(new Date().getTime() / 1000);
// 当前日期大于等于开始时间并且当前日期小于等于结束时间,门票可退
if (nowdate <= endTime) list.push(item);
break;
case '4':// 几天内可退
let nowtime = parseInt(new Date().getTime() / 1000);
console.log(nowtime - creaetd)
// 当前时间减下单时间如果小于等于后台设定天数。门票可退
if (((nowtime - creaetd) / 60 / 60 / 24) <= waper.orderItemList[0].refundDay) list.push(item);
break;
}
} else if (waper.orderItemList[0].classify == '2') {// 套票
// 判断是否再有效期
let num = 0;// 大于0代表已经使用过
switch (waper.orderItemList[0].refundRule) {
case '3':// 有效期可退
item.orderDetailChildList.forEach((child, childIndex) => {
if (child.verificationNum > 0) num ++;
})
if (num == 0) {
// let startTime = parseInt(new Date(this.$utils.formatDate('Y-M-D', item.availableStartTime) + ' 00:00:00').getTime() / 1000);
let endTime = parseInt(new Date(this.$utils.formatDate('Y-M-D', item.availableEndTime) + ' 23:59:59').getTime() / 1000);
let nowdate = parseInt(new Date().getTime() / 1000);
// 当前日期大于等于开始时间并且当前日期小于等于结束时间,门票可退
if (nowdate <= endTime) list.push(item);
}
break;
case '4':// 几天内可退
item.orderDetailChildList.forEach((child, childIndex) => {
if (child.verificationNum > 0) num ++;
})
if (num == 0) {
let nowtime = parseInt(new Date().getTime() / 1000);
console.log(nowtime - creaetd)
// 当前时间减下单时间如果小于等于后台设定天数。门票可退
if (((nowtime - creaetd) / 60 / 60 / 24) <= waper.orderItemList[0].refundDay) list.push(item);
}
break;
}
} else if (waper.orderItemList[0].classify == '4') {// 年卡
if (item.activationStatus == '0') {
list.push(item)
}
}
} else info.rows[waperIndex].showRefund = false;
} else info.rows[waperIndex].showRefund = false;
})
if (list.length > 0) info.rows[waperIndex].showRefund = true;
} else info.rows[waperIndex].showRefund = false;
})
}
this.list = this.list.concat(info.rows);
this.mescroll.endBySize(info.rows.length, info.total);
}
}
}
</script>
<style lang="scss">
.menu{
width: 100%; height: 90rpx; margin-bottom: 15rpx; position: fixed; left: 0; box-sizing: border-box; padding: 0 32rpx; display: flex; justify-content: space-between; align-items: center; background: #FBFBFB; z-index: 11;
view{
line-height: 46rpx; color: #333; font-size: 32rpx;
&.active{
position: relative; color: #03AE80; font-weight: 500;
&::after{ content: ""; width: 30rpx; height: 4rpx; background: #03AE80; position: absolute; left: 50%; transform: translateX(-50%); top: 52rpx; }
}
}
}
.list_waper{
width: 100%; box-sizing: border-box; padding: 0 32rpx 24rpx;
.list{
width: 100%; box-sizing: border-box; padding: 32rpx 24rpx; background: #fff; border-radius: 10rpx; margin-bottom: 24rpx;
&:last-child{ margin-bottom: 0; }
.title{
width: 100%; box-sizing: border-box; padding-right: 120rpx; position: relative;
.text{color: #666; font-size: 28rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.status{ width: 120rpx; color: #03AE80; font-size: 28rpx; position: absolute; right: 0; top: 0; text-align: right; }
}
.info{
padding-left: 160rpx; margin-top: 24rpx; position: relative;
.img{
width: 140rpx; height: 140rpx; position: absolute; left: 0; top: 0;
image{ width: 100%; height: 100%; vertical-align: top; border-radius: 10rpx; }
}
.cont{
position: relative; width: 100%; box-sizing: border-box; padding-right: 100rpx; height: 140rpx;
.col{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.col1{ color: #333; font-size: 28rpx; font-weight: 500; }
.col2{ margin-top: 20rpx; color: #666; font-size: 24rpx; }
.col3{ margin-top: 8rpx; color: #666; font-size: 24rpx; }
.price {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
text-align: center;
view {
&:nth-child(1) {
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
&:nth-child(2) {
font-weight: 400;
font-size: 24rpx;
color: #666666;
margin-top: 4rpx;
}
}
}
}
}
.btns{ width: 100%; padding-top: 28rpx; margin-top: 32rpx; display: flex; justify-content: flex-end; align-items: center; border-top: 1rpx solid rgba(0,0,0,0.1);
.btn{
text-align: center; font-size: 28rpx; margin-right: 16rpx;
&:last-child{ margin-right: 0; }
}
.active {
width: 158rpx;
height: 64rpx;
background: linear-gradient( 141deg, #54C76E 0%, #03AE80 100%);
border-radius: 100rpx;
line-height: 64rpx;
color: #FFFFFF;
}
.default {
width: 156rpx;
height: 61rpx;
border-radius: 60rpx;
line-height: 61rpx;
border: 1rpx solid #A2A2A4;
color: #A2A2A4;
}
}
}
}
</style>