You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
shop-pc/pages/account/index/order/detail/module/StatusInfo.vue

172 lines
4.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
* @Author: ch
* @Date: 2022-05-09 14:41:37
* @LastEditors: ch
* @LastEditTime: 2022-05-16 18:27:52
* @Description: file content
-->
<template>
<div class="operation">
<span>订单编号{{orderInfo.orderNo}}</span>
<p>订单状态{{ctxCon.name}}</p>
<span>{{ctxCon.tips}}</span>
<div class="operation--btns">
<!-- 已发货可以确认收货 -->
<UiButton v-if="orderInfo.orderStatus === 4" type="yellow_gradual" :radius="true" @click="receive">确认收货</UiButton>
<!-- 待支付可以取消,支付订单 -->
<template v-if="orderInfo.orderStatus === 1">
<UiButton type="yellow_gradual" :radius="true" @click="payVisible = true">去支付</UiButton>
<UiButton type="grey" :radius="true" @click="cancelVisible=true"></UiButton>
</template>
</div>
<BsCancelOrder :visible.sync="cancelVisible" :orderId="orderInfo.orderId" @cancel="emitStatus"/>
<BsPay :visible.sync="payVisible" :orderId="orderInfo.orderId" @finish="emitStatus" @cancel="emitStatus"/>
</div>
</template>
<script>
import {ApiPutOrderReceive} from '@/plugins/api/order';
import BsPay from '@/components/BsPay.vue'
import UiButton from '@/components/UiButton.vue'
import BsCancelOrder from '../../../../../../components/BsCancelOrder.vue'
export default {
components: { UiButton, BsPay, BsCancelOrder },
props: {
orderInfo : {
type : Object,
default : () => ({})
}
},
data(){
return {
ctxData : {
// 待付款
'1' : {name:'待付款', tips:''},
// 关闭
'2' : {name:'交易关闭' , tips:'关闭原因'},
// 已支付
'3' : {name:'待发货', tips:'您的包裹整装待发'},
// 已发货
'4' : {name:'待收货', tips:'您的包裹正向您飞来'},
// 已收货
'5' : {name:'已收货'},
// 已完成
'6' : {name:'交易成功'},
},
ctxCon : {},
startSecondNum : 0,
timerStop : null,
cancelVisible : false,
payVisible : false
}
},
watch : {
orderInfo(nVal){
const {orderStatus, autoReceiveTime, serverTime} = this.orderInfo;
this.ctxCon = this.ctxData[orderStatus];
if(orderStatus === 1){
// 待支付 开始倒计时
if(this.timerStop){
clearTimeout(this.timerStop);
}
this.calcTimerStartSecondNum();
this.timer();
}else if(orderStatus === 4){
const receiveTime = (new Date(autoReceiveTime.replace(/-/g,'/'))).getTime();
const curTime = (new Date(serverTime.replace(/-/g,'/'))).getTime();
const minute = parseInt((receiveTime - curTime) / 60000);
const day = parseInt(Math.floor(minute / 1440));
const hour = parseInt(Math.floor((minute - day * 1440) / 60));
const m = parseInt(Math.floor(minute - ((day * 24 + hour) * 60)));
let str = `${day ? `${day}${hour}${m}` : (hour ? `${hour}${m}` : ( m ? `${m}` : '1分'))}`;
this.ctxCon.tips = `${str}后,将自动确认收货`
}else if(orderStatus === 2){
this.ctxCon.tips = this.orderInfo.cancelReason;
}
}
},
methods:{
/**
* 计算待支付倒计时开始秒数
*/
calcTimerStartSecondNum(){
let expireTime = (new Date(this.orderInfo.expireTime.replace(/-/g,'/'))).getTime(),
curTime = (new Date(this.orderInfo.serverTime.replace(/-/g,'/'))).getTime(),
second = Math.floor((expireTime - curTime) / 1000);
this.startSecondNum = second > 0 ? second : 0;
},
/**
* 待付款的倒计时
*/
timer(){
if(this.startSecondNum == 0){
this.emitStatus()
return;
}
this.startSecondNum--;
let minute = parseInt(this.startSecondNum / 60);
let second = parseInt(this.startSecondNum % 60);
this.ctxCon.tips = `剩余${minute > 0 ? `${minute}` : ''} ${second}`;
this.timerStop = setTimeout(()=>this.timer(),1000)
},
/**
* 确认收货
*/
receive(){
this.$confirm('确认已经收到货了吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const {error} = await ApiPutOrderReceive({orderId : this.orderInfo.orderId});
if(error){
uni.$toast(error.message);
return false;
}
this.$message({
type: 'success',
message: '成功收货!'
});
this.emitStatus()
});
},
emitStatus(){
// 如果有倒计时 则停止倒计时
if(this.timerStop){
clearTimeout(this.timerStop);
}
this.$emit('changeStatus');
}
}
}
</script>
<style lang="scss" scoped>
.operation{
width: 300px;
height: 200px;
background: #f8f8f8;
padding-top: 20px;
text-align: center;
border-right: 1px solid #ddd;
span{
color: #999;
}
p{
font-size: 14px;
margin: 30px 0 15px;
}
&--btns{
margin-top: 30px;
button{
margin: 0 7px;
width: 100px;
}
}
}
</style>