185 lines
6.2 KiB
Vue
185 lines
6.2 KiB
Vue
|
<template>
|
|||
|
<view class="waper">
|
|||
|
<u-navbar @leftClick="leftClick" :placeholder="true" bgColor="#FFFFFF">
|
|||
|
<view slot='center' style="font-size: 36rpx; font-weight: bold;">
|
|||
|
申请退款
|
|||
|
</view>
|
|||
|
</u-navbar>
|
|||
|
<view v-if="detail">
|
|||
|
<view class="content" v-if="!reason">
|
|||
|
<view class="amount">
|
|||
|
<view class="label">退款金额</view>
|
|||
|
<view class="price"><text>¥</text>{{ refund }}</view>
|
|||
|
</view>
|
|||
|
<view class="reason" @click="reason = true">
|
|||
|
<view class="label">退款原因</view>
|
|||
|
<view class="con">
|
|||
|
<text>{{ isReason.dictLabel }}</text>
|
|||
|
<u-icon name="arrow-right" color="rgba(0,0,0,0.85)" size="28rpx"></u-icon>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="detailed">
|
|||
|
<view class="title">退款明细</view>
|
|||
|
<view class="row">
|
|||
|
<view>房费</view>
|
|||
|
<view>¥{{ detail.totalAmount }}</view>
|
|||
|
</view>
|
|||
|
<view class="row" v-if="amount">
|
|||
|
<view>违约金</view>
|
|||
|
<view>¥{{ amount }}</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="detailed">
|
|||
|
<view class="title">退回方式</view>
|
|||
|
<view class="row">
|
|||
|
<view>退回原支付方式</view>
|
|||
|
<view>预计1-3个工作日到账</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="footer" :style="'padding-bottom: ' + windowBottom + 'px;'">
|
|||
|
<view class="btn btn1" @click="cancel">取消申请</view>
|
|||
|
<view class="btn btn2" @click="confirm">确认提交</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="content" v-if="reason">
|
|||
|
<view class="h4">申请退款</view>
|
|||
|
<view class="h8">请选择退款原因,以帮助我们改进</view>
|
|||
|
<view class="list">
|
|||
|
<view class="item" v-for="(item, index) in reasonList" :key="index" @click="changeReason(item)">
|
|||
|
<view class="label">{{item.dictLabel}}</view>
|
|||
|
<view class="noChange" v-if="isReason.dictValue != item.dictValue"></view>
|
|||
|
<view class="isChange" v-if="isReason.dictValue == item.dictValue">
|
|||
|
<u-icon name="checkmark" color="#fff" size="28rpx" />
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="footer" :style="'padding-bottom: ' + windowBottom + 'px;'">
|
|||
|
<view class="btn3" @click="submit">提交</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data () {
|
|||
|
return {
|
|||
|
windowBottom: 0,
|
|||
|
id: '',
|
|||
|
amount: null,
|
|||
|
refund: null,
|
|||
|
detail: null,
|
|||
|
reason: false,
|
|||
|
reasonList: [],
|
|||
|
isReason: {}
|
|||
|
}
|
|||
|
},
|
|||
|
onLoad (options) {
|
|||
|
this.id = options.id;
|
|||
|
this.amount = Number(options.amount);
|
|||
|
this.refund = options.refund;
|
|||
|
this.getDate();
|
|||
|
this.common();
|
|||
|
this.windowBottom = this.$safeAreaBottom || uni.upx2px(20);
|
|||
|
},
|
|||
|
|
|||
|
methods: {
|
|||
|
async getDate() {
|
|||
|
let res = await this.$http.hotelOrderDetail(this.id);
|
|||
|
this.detail = res.data;
|
|||
|
},
|
|||
|
async common() {
|
|||
|
const params = {
|
|||
|
dictType: 'hotel_homestay_personal_refund_type'
|
|||
|
}
|
|||
|
let info = await this.$http.common(params)
|
|||
|
if (info.code === 200) {
|
|||
|
this.reasonList = info.data;
|
|||
|
} else {
|
|||
|
uni.$u.toast(info.msg);
|
|||
|
}
|
|||
|
},
|
|||
|
changeReason(i) {
|
|||
|
this.isReason = i;
|
|||
|
},
|
|||
|
submit() {
|
|||
|
this.reason = false;
|
|||
|
},
|
|||
|
cancel() {
|
|||
|
uni.navigateBack();
|
|||
|
},
|
|||
|
async confirm() {
|
|||
|
if (!this.isReason.dictValue) {
|
|||
|
uni.showToast({ mask: true, title: '请选择退款原因', icon: 'none' });
|
|||
|
return false;
|
|||
|
}
|
|||
|
let params = {
|
|||
|
orderId: this.id,
|
|||
|
personalRefundType: this.isReason.dictValue
|
|||
|
}
|
|||
|
let info = await this.$http.hotelOrderCancel(params);
|
|||
|
uni.$u.toast('提交成功');
|
|||
|
setTimeout(() => {
|
|||
|
uni.navigateBack();
|
|||
|
}, 1500)
|
|||
|
},
|
|||
|
leftClick () {
|
|||
|
if (this.reason) {
|
|||
|
this.reason = false;
|
|||
|
} else {
|
|||
|
uni.navigateBack();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss">
|
|||
|
.waper { min-height: 100vh; background-color: #F6F6F6; }
|
|||
|
.content {
|
|||
|
padding: 24rpx; box-sizing: border-box;
|
|||
|
.amount {
|
|||
|
height: 103rpx; background: #FFFFFF; border-radius: 10rpx; padding: 0 24rpx; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between;
|
|||
|
.label { font-size: 28rpx; color: rgba(0,0,0,0.85); }
|
|||
|
.price {
|
|||
|
font-weight: bold; font-size: 42rpx; color: #EE595A;
|
|||
|
text { font-weight: 400; font-size: 24rpx; }
|
|||
|
}
|
|||
|
}
|
|||
|
.reason {
|
|||
|
height: 103rpx; margin-top: 22rpx; background: #FFFFFF; border-radius: 10rpx; padding: 0 24rpx; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; font-size: 28rpx; color: rgba(0,0,0,0.85);
|
|||
|
.con {flex: 1; display: flex; align-items: center; justify-content: flex-end;}
|
|||
|
}
|
|||
|
.detailed {
|
|||
|
margin-top: 22rpx; background: #FFFFFF; border-radius: 10rpx; padding: 30rpx 24rpx; box-sizing: border-box;
|
|||
|
.title { font-size: 28rpx; color: rgba(0,0,0,0.45); }
|
|||
|
.row {
|
|||
|
margin-top: 20rpx; display: flex; align-items: center; justify-content: space-between;
|
|||
|
view { font-size: 28rpx; color: rgba(0,0,0,0.85); }
|
|||
|
}
|
|||
|
}
|
|||
|
.h4 { font-weight: 500; font-size: 32rpx; color: rgba(0,0,0,0.85); }
|
|||
|
.h8 { font-size: 26rpx; color: rgba(0,0,0,0.45); margin-top: 12rpx; }
|
|||
|
.list {
|
|||
|
margin-top: 24rpx; background-color: #FFFFFF;
|
|||
|
.item {
|
|||
|
margin: 0 24rpx; box-sizing: border-box; height: 109rpx; border-bottom: 1rpx solid #E8E8E8; display: flex; align-items: center; justify-content: space-between;
|
|||
|
&:last-child { border-bottom: none; }
|
|||
|
.label { font-size: 30rpx; color: rgba(0,0,0,0.85); }
|
|||
|
.noChange { width: 42rpx; height: 42rpx; border-radius: 50%; border: 1rpx solid rgba(0,0,0,0.2); }
|
|||
|
.isChange {
|
|||
|
width: 42rpx; height: 42rpx; border-radius: 50%; border: 1rpx solid #03AE80; background-color: #03AE80; position: relative;
|
|||
|
::v-deep .u-icon{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.footer {
|
|||
|
position: fixed; left: 0; bottom: 0; width: 100%; background: #FFFFFF; box-shadow: 0rpx -1rpx 6rpx 0rpx rgba(0,0,0,0.05); padding: 20rpx 24rpx 0; box-sizing: border-box; display: flex; align-items: center; justify-content: flex-end;
|
|||
|
.btn { width: 200rpx; height: 80rpx; line-height: 80rpx; text-align: center; border-radius: 66rpx; font-size: 30rpx; }
|
|||
|
.btn1 { border: 1rpx solid rgba(0,0,0,0.45); color: rgba(0,0,0,0.45); margin-right: 24rpx; }
|
|||
|
.btn2 { background: #03AE80; color: #FFFFFF; }
|
|||
|
.btn3 { width: 654rpx; height: 90rpx; background: #03AE80; border-radius: 49rpx; line-height: 90rpx; text-align: center; font-weight: 500; font-size: 32rpx; color: #FFFFFF; margin: 0 auto; }
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|