-
2package.json
-
12121pnpm-lock.yaml
-
194src/components/end_billing_modal/end_billing_modal.vue
-
2src/components/fixed_bar/fixed_bar.vue
-
5src/components/order_refund/modal.vue
-
49src/components/order_refund/permission_btn.vue
-
185src/components/timing_order/timing_order.vue
-
1src/js/api.js
-
36src/pages.json
-
12src/pages/order_list/order_list.vue
-
4src/pages/order_search/order_search.vue
-
3src/store/actions.js
-
1src/subpackage/device/js/device_api.js
-
32src/subpackage/order/components/kv_line.vue
-
36src/subpackage/order/components/kvs_line.vue
-
92src/subpackage/order/components/order_list/filter_modal.vue
-
112src/subpackage/order/components/order_list/header.vue
-
140src/subpackage/order/components/order_list/period_modal.vue
-
100src/subpackage/order/components/order_list/stadium_select.vue
-
11src/subpackage/order/js/api.js
-
18src/subpackage/order/pages/order_manage/order_manage.vue
-
24src/subpackage/order/pages/timekeeping/modules/order_detail/bottom_fixed.vue
-
261src/subpackage/order/pages/timekeeping/modules/order_detail/end_billing_modal.vue
-
43src/subpackage/order/pages/timekeeping/modules/order_detail/header_temp.vue
-
34src/subpackage/order/pages/timekeeping/modules/order_detail/info_temp.vue
-
58src/subpackage/order/pages/timekeeping/modules/order_list/deposit.vue
-
68src/subpackage/order/pages/timekeeping/modules/order_list/item_temp.vue
-
84src/subpackage/order/pages/timekeeping/modules/order_list/person.vue
-
94src/subpackage/order/pages/timekeeping/modules/order_list/site.vue
-
62src/subpackage/order/pages/timekeeping/modules/order_search/search_bar.vue
-
126src/subpackage/order/pages/timekeeping/order_detail/common.js
-
211src/subpackage/order/pages/timekeeping/order_detail/deposit.vue
-
268src/subpackage/order/pages/timekeeping/order_detail/person.vue
-
382src/subpackage/order/pages/timekeeping/order_detail/site.vue
-
281src/subpackage/order/pages/timekeeping/order_list.vue
-
132src/subpackage/order/pages/timekeeping/order_search.vue
-
379src/subpackage/order/pages/timing/detail.vue
-
BINsrc/subpackage/order/static/images/filter.png
-
BINsrc/subpackage/order/static/images/order_manage/order_22.png
-
0src/subpackage/order/static/images/order_manage/order_23.png
-
BINsrc/subpackage/order/static/images/round_close.png
-
BINsrc/subpackage/order/static/images/search.png
-
20197yarn.lock
12121
pnpm-lock.yaml
File diff suppressed because it is too large
View File
@ -1,194 +0,0 @@ |
|||
<template> |
|||
<!-- 弹框 结束计费 --> |
|||
<view class="ox-dark-mask" @touchmove.stop.prevent="moveHandle" @click.stop=""> |
|||
<view class="odm-end-modal" > |
|||
<view class="oem-close"> |
|||
<image src="/static/images/icon/x_close.png" @click="closeChange"></image> |
|||
</view> |
|||
<view class="oem-tit">结束计费</view> |
|||
<view class="oem-line">操作人:{{orderInfo.end_bill_operator_name || '-'}}</view> |
|||
<view class="oem-line">时长合计:<text class="ol-txt1">{{orderInfo.extension.duration || '-'}}</text></view> |
|||
<view class="oem-line">金额合计:<text class="ol-txt2">¥{{orderInfo.amount || 0}}</text></view> |
|||
<view class="oem-box"> |
|||
<view @click="selectBtn(1)"> |
|||
<image :class="[selectType==1?'ob-img':'']" :src="selectType==1?'/static/images/icon/selected_ring.png':''"></image> |
|||
<view :class="[selectType==1?'ov-active':'']">停止计时</view> |
|||
</view> |
|||
<view @click="selectBtn(2)"> |
|||
<image :class="[selectType==2?'ob-img':'']" :src="selectType==2?'/static/images/icon/selected_ring.png':''"></image> |
|||
<view :class="[selectType==2?'ov-active':'']">完结订单</view> |
|||
</view> |
|||
</view> |
|||
<view class="oem-tips">*<text>请输入金额</text></view> |
|||
<view class="oem-ipt"><input type="digit" v-model="input_amount"/></view> |
|||
<view class="oem-btn" hover-class="hover-active" @click="confirmChange" >确认</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '@/utils/util'; |
|||
import deviceApi from '../../subpackage/device/js/device_api.js'; |
|||
import deviceServer from '../../subpackage/device/js/device_server.js'; |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
props: { |
|||
orderInfo: { |
|||
type: Object, |
|||
default: ()=>({}) |
|||
} |
|||
|
|||
}, |
|||
computed: { |
|||
...mapState(['brandInfo']), |
|||
}, |
|||
|
|||
data() { |
|||
return { |
|||
input_amount: "", |
|||
selectType: 1, //默认1(停止计时) 2(完结订单) |
|||
} |
|||
}, |
|||
methods: { |
|||
moveHandle(){}, |
|||
closeChange(){ |
|||
this.$emit('close'); |
|||
}, |
|||
|
|||
confirmChange(){ |
|||
let { brandInfo, orderInfo, input_amount, selectType } = this |
|||
if(input_amount == '')return util.showNone('请输入金额!'); |
|||
util.showLoad(); |
|||
deviceServer.get({ |
|||
url: deviceApi.timeOrderEnd, |
|||
data: { |
|||
brand_id: brandInfo.brand.id, |
|||
order_no: orderInfo.order_no, |
|||
pay_amount: parseFloat(input_amount), |
|||
end_type: selectType==1?'end_timing':selectType==2?'end_order':'', |
|||
}, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad() |
|||
util.showNone('操作成功!'); |
|||
this.$emit('close'); |
|||
// setTimeout(()=>uni.navigateBack(),1200); |
|||
this.$emit('timeEndBtn'); |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
|
|||
selectBtn(type){ |
|||
this.selectType = type |
|||
}, |
|||
}, |
|||
} |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" > |
|||
@import '~style/public.scss'; |
|||
.odm-end-modal{ |
|||
position: absolute; |
|||
left: 65rpx; |
|||
top: 12%; |
|||
background-color: #fff; |
|||
width: 620rpx; |
|||
padding: 30rpx 0rpx 60rpx; |
|||
border-radius: 10rpx; |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
.oem-close{ |
|||
width: 100%; |
|||
@include centerFlex(flex-end); |
|||
>image{ |
|||
width: 32rpx; |
|||
height: 32rpx; |
|||
margin-right: 30rpx; |
|||
} |
|||
} |
|||
.oem-tit { |
|||
color: #1A1A1A; |
|||
font-size: 32rpx; |
|||
font-weight: 700; |
|||
margin: 16rpx 0rpx 34rpx; |
|||
} |
|||
.oem-line{ |
|||
width: 456rpx; |
|||
color: #1A1A1A; |
|||
font-size: 28rpx; |
|||
line-height: 48rpx; |
|||
.ol-txt1{ |
|||
color: #009874; |
|||
} |
|||
.ol-txt2{ |
|||
color: #FF873D; |
|||
} |
|||
} |
|||
.oem-box{ |
|||
margin: 58rpx 0 48rpx; |
|||
width: 456rpx; |
|||
@include centerFlex(space-between); |
|||
>view{ |
|||
@include centerFlex(flex-start); |
|||
>image{ |
|||
flex-shrink: 0; |
|||
width: 28rpx; |
|||
height: 28rpx; |
|||
border-radius: 50%; |
|||
border: 2rpx solid #D8D8D8; |
|||
&.ob-img{ |
|||
width: 32rpx; |
|||
height: 32rpx; |
|||
border: 0rpx solid #D8D8D8; |
|||
} |
|||
} |
|||
>view{ |
|||
margin-left: 12rpx; |
|||
font-size: 28rpx; |
|||
line-height: 48rpx; |
|||
color: #9C9C9F; |
|||
&.ov-active{ |
|||
color: #1A1A1A; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
.oem-tips{ |
|||
width: 456rpx; |
|||
margin: 0rpx 0rpx 8rpx; |
|||
color: #EA5061; |
|||
font-size: 28rpx; |
|||
>text{ |
|||
color: #333333; |
|||
} |
|||
} |
|||
.oem-ipt{ |
|||
width: 456rpx; |
|||
border: 2rpx solid #D8D8D8; |
|||
border-radius: 10rpx; |
|||
& input { |
|||
flex-grow: 1; |
|||
height: 88rpx; |
|||
color: #1A1A1A; |
|||
font-size: 28rpx; |
|||
padding: 0rpx 20rpx; |
|||
} |
|||
} |
|||
.oem-btn{ |
|||
width: 240rpx; |
|||
height: 88rpx; |
|||
margin-top: 60rpx; |
|||
border-radius: 10rpx; |
|||
background-color: #009874; |
|||
color: #FFF; |
|||
font-size: 32rpx; |
|||
line-height: 88rpx; |
|||
text-align: center; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,49 @@ |
|||
<template> |
|||
<view class="permissinon-btn"> |
|||
<or-button v-if="isShow" @click="$emit('click:button')"><slot>退款</slot></or-button> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import orButton from "./button.vue"; |
|||
import { mapState } from 'vuex'; |
|||
/** |
|||
* 全部订单都能退两次, 所有订单最多只能退2次款 |
|||
* 只要订单金额是未全退的,都能退 |
|||
* 0元订单不能退 |
|||
* |
|||
*/ |
|||
export default { |
|||
components: { |
|||
orButton |
|||
}, |
|||
props: [ 'pay_amount', 'refund_amount', 'refund_times' ], |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
payAmount(){ |
|||
let { pay_amount } = this; |
|||
return +pay_amount || 0 |
|||
}, |
|||
refundAmount(){ |
|||
let { refund_amount } = this; |
|||
return +refund_amount || 0 |
|||
}, |
|||
isShow(){ |
|||
let { payAmount, refundAmount, refund_times, brandInfo } = this; |
|||
console.log('brandInfo', payAmount, refundAmount, refund_times, brandInfo) |
|||
if( |
|||
payAmount - refundAmount > 0 |
|||
&&[0, 1].includes(refund_times) |
|||
&&brandInfo?.permission?.['1018'] // 退款权限 |
|||
){ |
|||
return true |
|||
} |
|||
return false |
|||
} |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
|
|||
</style> |
@ -1,185 +0,0 @@ |
|||
<template> |
|||
<view class="timing-order" @click="toOrderDetails"> |
|||
<view class="ro-header"> |
|||
<view class="rh-view">{{orderInfo.stadium_name || '-'}}</view> |
|||
<text :class="[ 'rh-text', orderInfo.pay_status == 0?'rh-active':'' ]">{{zh_order_status(orderInfo.pay_status)}}</text> |
|||
</view> |
|||
<view class="ro-section"> |
|||
<view class="rs-line"> |
|||
<view class="rl-view">订单编号:</view> |
|||
<view class="rl-view"> |
|||
<view class="rv-view">{{orderInfo.order_no || '-'}}</view> |
|||
</view> |
|||
<image class="rl-image" src="/static/images/icon/arrow_b2.png"></image> |
|||
</view> |
|||
<!-- 场时有 人时没有 order_type: 1场时 2人时 --> |
|||
<view class="rs-line" v-if="orderInfo.order_type == 1"> |
|||
<view class="rl-view">项目:</view> |
|||
<view class="rl-view"> |
|||
<view class="rv-view">{{orderInfo.project_name || '-'}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="rs-line"> |
|||
<view class="rl-view">时长:</view> |
|||
<view class="rl-view"> |
|||
<view :class="[ 'rv-view', orderInfo.pay_status == 0?'rv-active':'' ]">{{ orderInfo.extension.duration || '-'}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="rs-btn" v-if="orderInfo.pay_status == 0&&orderInfo.early_end_timing==false"><view @click.stop="isEndBill=true">结束计费</view></view> |
|||
</view> |
|||
<view class="ro-bot" v-if="orderInfo.pay_status != 0"> |
|||
<view class="rb-total">实付款 <text class="rt-txt"> ¥{{orderInfo.pay_amount || 0}}</text></view> |
|||
</view> |
|||
|
|||
<!-- 结束计费弹框 --> |
|||
<end-billing-modal |
|||
v-if="isEndBill==true" |
|||
@close="isEndBill=false" |
|||
@timeEndBtn="timeEndBtn" |
|||
:orderInfo="orderInfo" |
|||
></end-billing-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '@/utils/util'; |
|||
import end_billing_modal from '../end_billing_modal/end_billing_modal.vue'; |
|||
export default { |
|||
components: { |
|||
'end-billing-modal': end_billing_modal, |
|||
}, |
|||
props: { |
|||
orderInfo: { |
|||
type: Object, |
|||
default: ()=>({}) |
|||
} |
|||
}, |
|||
computed: { |
|||
zh_order_status(){ |
|||
// 订单状态 0计费中1已完成 |
|||
let { orderInfo } = this |
|||
return status =>{ |
|||
const _obj = { |
|||
'0': orderInfo.early_end_timing==true?'待支付':'计费中', |
|||
'1': '已完成', |
|||
'4': '已退款', |
|||
} |
|||
return _obj[`${status}`] || '-' |
|||
} |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
isEndBill: false, |
|||
} |
|||
}, |
|||
methods:{ |
|||
toOrderDetails(){ |
|||
let { orderInfo } = this |
|||
// let _query = {} |
|||
// _query["stadium_id"] = orderInfo.stadium_id |
|||
// _query["order_no"] = orderInfo.order_no |
|||
// _query["order_type"] = 1 |
|||
let _str = `stadium_id=${orderInfo.stadium_id || ''}&order_no=${orderInfo.order_no || ''}` |
|||
util.routeTo(`/subpackage/order/pages/timing/detail?${_str}`,'nT'); |
|||
// this.$emit('orderDetailChange'); |
|||
}, |
|||
timeEndBtn(){ |
|||
this.$emit('refreshList'); |
|||
}, |
|||
} |
|||
|
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" > |
|||
@import '~style/public.scss'; |
|||
.timing-order{ |
|||
padding: 0 24upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
.ro-header{ |
|||
margin-bottom: 18upx; |
|||
height: 98upx; |
|||
line-height: 96upx; |
|||
border-bottom: 2upx solid #D8D8D8; |
|||
@include centerFlex(space-between); |
|||
.rh-view{ |
|||
flex-grow: 1; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
@include textHide(1); |
|||
} |
|||
.rh-text{ |
|||
margin-left: 20upx; |
|||
flex-shrink: 0; |
|||
font-size: 28upx; |
|||
color: #9C9C9F; |
|||
} |
|||
.rh-active{ |
|||
color: $themeColor; |
|||
} |
|||
} |
|||
.ro-section{ |
|||
padding-bottom: 30upx; |
|||
.rs-line{ |
|||
display: flex; |
|||
.rl-view,.rv-view{ |
|||
line-height: 40upx; |
|||
font-size: 24upx; |
|||
color: #9c9c9f; |
|||
} |
|||
.rl-view{ |
|||
&:first-child{ |
|||
flex-shrink: 0; |
|||
} |
|||
&+.rl-view{ |
|||
flex-grow: 1; |
|||
.rv-view{ |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
} |
|||
.rv-active{ |
|||
color: $themeColor; |
|||
} |
|||
>.rl-image{ |
|||
width: 32rpx; |
|||
height: 32rpx; |
|||
} |
|||
} |
|||
|
|||
.rs-btn{ |
|||
margin-top: 8rpx; |
|||
@include centerFlex(flex-end); |
|||
>view{ |
|||
width: 192rpx; |
|||
height: 80rpx; |
|||
border: 2rpx solid #009874; |
|||
border-radius: 10rpx; |
|||
color: #009874; |
|||
font-size: 32rpx; |
|||
font-weight: 500; |
|||
text-align: center; |
|||
line-height: 80rpx; |
|||
} |
|||
} |
|||
|
|||
} |
|||
.ro-bot{ |
|||
padding-top: 20upx; |
|||
padding-bottom: 30upx; |
|||
border-top: 2upx solid #D8D8D8; |
|||
.rb-total{ |
|||
line-height: 40upx; |
|||
text-align: right; |
|||
font-size: 24upx; |
|||
color: #9c9c9f; |
|||
.rt-txt{ |
|||
color: #1A1A1A; |
|||
margin-left: 10rpx; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,32 @@ |
|||
<template> |
|||
<view class="kv-line"> |
|||
<view class="kl-name">{{ label || '' }}</view> |
|||
<view class="kl-val"><slot name="default">value</slot></view> |
|||
<slot name="right"></slot> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
label: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.kv-line{ |
|||
@include ctf; |
|||
.kl-name{ |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 48upx, #9C9C9F); |
|||
} |
|||
.kl-val{ |
|||
@include flcw(28upx, 48upx, #1A1A1A); |
|||
@include tHide; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,36 @@ |
|||
<template> |
|||
<view class="s-line"> |
|||
<view class="sl-view">{{ label }}</view> |
|||
<view class="sl-view"> |
|||
<slot></slot> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
label: { |
|||
default: '' |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
|
|||
.s-line{ |
|||
@include ctf(space-between); |
|||
.sl-view{ |
|||
&:first-child{ |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 60upx, #1A1A1A); |
|||
} |
|||
&+.sl-view{ |
|||
margin-left: 20upx; |
|||
@include flcw(24upx, 60upx, #1A1A1A); |
|||
@include tHide; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,92 @@ |
|||
<template> |
|||
<view class="filter-modal" v-show="visibled" @click="hide"> |
|||
<scroll-view class="fm-container" scroll-y @click.stop="_=>false"> |
|||
<view class="fc-title">{{ title }}</view> |
|||
<view class="fc-list"> |
|||
<view |
|||
class="fl-item" |
|||
:class="{ active: curValue === e.value }" |
|||
v-for="(e, i) in list" |
|||
:key="i" |
|||
@click="itemClick(e)" |
|||
>{{ e.label }}</view> |
|||
</view> |
|||
</scroll-view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data(){ |
|||
return { |
|||
visibled: false, |
|||
title: '', |
|||
list: [], |
|||
curValue: '', |
|||
initOption: { |
|||
// success, |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
show(){ |
|||
this.visibled = true; |
|||
}, |
|||
hide(){ |
|||
this.visibled = false; |
|||
}, |
|||
init(e){ |
|||
this.title = e.title; |
|||
this.list = e.list; |
|||
this.curValue = e.curValue; |
|||
this.initOption = e; |
|||
this.show(); |
|||
}, |
|||
itemClick(e){ |
|||
this.initOption?.success?.(e); |
|||
this.hide(); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.filter-modal{ |
|||
position: fixed; |
|||
left: 0; |
|||
top: var(--window-top); |
|||
right: 0; |
|||
bottom: 0; |
|||
background-color: rgba(0, 0, 0, .5); |
|||
z-index: 10; |
|||
.fm-container{ |
|||
position: absolute; |
|||
right: 0; |
|||
top: 0; |
|||
bottom: 0; |
|||
width: 500upx; |
|||
height: 100%; |
|||
padding-left: 42upx; |
|||
background-color: #fff; |
|||
padding-top: 26upx; |
|||
padding-left: 42upx; |
|||
padding-bottom: 40upx; |
|||
.fc-title{ |
|||
margin-bottom: 58upx; |
|||
padding: 50upx 0; |
|||
border-bottom: 2upx solid #D8D8D8; |
|||
@include flcw(24upx, 34upx, #9c9c9f); |
|||
} |
|||
.fc-list{ |
|||
.fl-item{ |
|||
margin-bottom: 50upx; |
|||
@include tHide; |
|||
@include flcw(32upx, 44upx, #1a1a1a); |
|||
&.active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,112 @@ |
|||
<template> |
|||
<view class="order-list-header"> |
|||
<!-- 门店选择 --> |
|||
<stadium-select |
|||
ref="stadiumSelect" |
|||
:visibled="isStadium" |
|||
@change:stadium="$emit('change:stadium', $event)" |
|||
></stadium-select> |
|||
<!-- 时间段 --> |
|||
<view class="olh-period"> |
|||
<view class="op-txt" @click="$emit('click:time')">{{ startTime || '' }} ~ {{ endTime || '' }}</view> |
|||
<view class="op-icon" @click="$emit('click:time')"></view> |
|||
</view> |
|||
<!-- 交易明细&按钮 --> |
|||
<view class="olh-bot"> |
|||
<view class="ob-desc"> |
|||
<text>成功交易{{ successCount || 0 }}笔,退款{{ refundCount || 0 }}笔</text> |
|||
</view> |
|||
<view class="ob-btns"> |
|||
<image @click="$emit('click:search')" class="ob-icon" src="../../static/images/search.png"></image> |
|||
<image @click="$emit('click:filter')" class="ob-icon" src="../../static/images/filter.png"></image> |
|||
</view> |
|||
</view> |
|||
<!-- 时间段选择弹窗 --> |
|||
<period-modal |
|||
ref="periodModal" |
|||
></period-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import stadiumSelect from './stadium_select.vue'; |
|||
import periodModal from "./period_modal.vue"; |
|||
export default { |
|||
components: { |
|||
'stadium-select': stadiumSelect, |
|||
'period-modal': periodModal |
|||
}, |
|||
props: { |
|||
startTime: { |
|||
default: '' |
|||
}, |
|||
endTime: { |
|||
default: '' |
|||
}, |
|||
successCount: { |
|||
default: 0 |
|||
}, |
|||
refundCount: { |
|||
default: 0 |
|||
}, |
|||
}, |
|||
data(){ |
|||
return { |
|||
isStadium: false |
|||
} |
|||
}, |
|||
methods: { |
|||
initStadiumSelect(brand_id){ |
|||
this.isStadium = !!brand_id; |
|||
return this.$refs.stadiumSelect.getStadiumList(brand_id); |
|||
}, |
|||
showPeriodModal(e){ |
|||
this.$refs.periodModal.show(e); |
|||
}, |
|||
periodConfirm(e){ |
|||
console.log('periodConfirm:', e) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.order-list-header{ |
|||
.olh-period{ |
|||
padding: 24upx 24upx 0upx; |
|||
@include ctf(flex-start); |
|||
.op-txt{ |
|||
@include flcw(32upx, 44upx, #1a1a1a, 500); |
|||
@include tHide(1); |
|||
} |
|||
.op-icon{ |
|||
flex-shrink: 0; |
|||
margin-left: 14upx; |
|||
width: 0; |
|||
height: 0; |
|||
border-left: 10upx solid transparent; |
|||
border-right: 10upx solid transparent; |
|||
border-top: 10upx solid #1a1a1a; |
|||
} |
|||
} |
|||
.olh-bot{ |
|||
padding: 16upx 24upx; |
|||
@include ctf(space-between); |
|||
.ob-desc{ |
|||
flex-grow: 1; |
|||
@include flcw(24upx, 34upx, #9c9c9f); |
|||
@include tHide(1); |
|||
} |
|||
.ob-btns{ |
|||
flex-shrink: 0; |
|||
@include ctf(flex-end); |
|||
.ob-icon{ |
|||
flex-shrink: 0; |
|||
margin-left: 40upx; |
|||
width: 40upx; |
|||
height: 40upx; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,140 @@ |
|||
<template> |
|||
<view class="period-modal" v-show="visibled" @click="hide"> |
|||
<view class="pm-period" @click.stop="()=>false"> |
|||
<view class="pp-tit">日期范围</view> |
|||
<picker class="pp-picker" mode="date" @change="startTimeChange" :value="start"> |
|||
<view class="pp-time"> |
|||
<text class="pt-txt">开始时间</text> |
|||
<view class="pt-right"> |
|||
<input class="pr-ipt" placeholder="选择时间" disabled :value="start" /> |
|||
<image class="pr-img" mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image> |
|||
</view> |
|||
</view> |
|||
</picker> |
|||
<picker class="pp-picker" mode="date" @change="endTimeChange" :value="end"> |
|||
<view class="pp-time"> |
|||
<text class="pt-txt">截止时间</text> |
|||
<view class="pt-right"> |
|||
<input class="pr-ipt" placeholder="选择时间" disabled :value="end" /> |
|||
<image class="pr-img" mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image> |
|||
</view> |
|||
</view> |
|||
</picker> |
|||
<view class="pl-btn active" @click="confirmPeriod">确定</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { showNone } from '@/utils/util'; |
|||
export default { |
|||
|
|||
data(){ |
|||
return { |
|||
start: '', |
|||
end: '', |
|||
visibled: false, |
|||
initOption: { |
|||
// success, |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
init(e){ |
|||
this.start = e.start; |
|||
this.end = e.end; |
|||
this.initOption = e; |
|||
this.show(); |
|||
}, |
|||
show(){ |
|||
this.visibled = true; |
|||
}, |
|||
hide(){ |
|||
this.visibled = false; |
|||
}, |
|||
startTimeChange(e){ |
|||
this.start = e.detail.value; |
|||
}, |
|||
endTimeChange(e){ |
|||
this.end = e.detail.value; |
|||
}, |
|||
confirmPeriod(){ |
|||
let { start, end, initOption } = this; |
|||
|
|||
if(!start || !end)return showNone('请选择日期范围!'); |
|||
|
|||
if( |
|||
new Date(start.replace(/\-/g,'/')).getTime() |
|||
> new Date(end.replace(/\-/g,'/')).getTime() |
|||
)return showNone('请选择合理时间!'); |
|||
|
|||
this.hide(); |
|||
initOption?.success?.({ start, end }); |
|||
this.$emit('click:cofirm', { start, end }); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.period-modal{ |
|||
position: fixed; |
|||
left: 0; |
|||
top: var(--window-top); |
|||
right: 0; |
|||
bottom: 0; |
|||
background-color: rgba(0, 0, 0, .5); |
|||
z-index: 10; |
|||
.pm-period{ |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
padding-left: 38upx; |
|||
padding-top: 66upx; |
|||
height: 472upx; |
|||
width: 100%; |
|||
background-color: #fff; |
|||
.pp-tit{ |
|||
@include flcw(24upx, 34upx, #9c9c9f); |
|||
} |
|||
.pp-picker{ |
|||
width: 100%; |
|||
|
|||
} |
|||
.pp-time{ |
|||
padding-right: 40upx; |
|||
height: 124upx; |
|||
border-bottom: 2upx solid #D8D8D8; |
|||
@include ctf(space-between); |
|||
.pt-txt{ |
|||
flex-shrink: 0; |
|||
@include flcw(32upx, 44upx, #1a1a1a); |
|||
} |
|||
.pt-right{ |
|||
flex-grow: 1; |
|||
@include ctf(flex-end); |
|||
.pr-ipt{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
text-align: right; |
|||
@include flcw(32upx, 44upx, #1a1a1a); |
|||
} |
|||
.pr-img{ |
|||
flex-shrink: 0; |
|||
margin-left: 36upx; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.pl-btn{ |
|||
text-align: center; |
|||
@include flcw(32upx, 124upx, rgba(0, 152, 116, .2), 500); |
|||
color: rgba(0, 152, 116, .2); |
|||
&.active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,100 @@ |
|||
<template> |
|||
<view class="stadium-select" v-show="visibled"> |
|||
<text class="ss-txt">当前门店</text> |
|||
<picker mode="selector" class="ss-picker" :range="stadiumList" range-key="name" @change="pickerChange"> |
|||
<view class="ss-frame"> |
|||
<input type="text" disabled class="sf-ipt" :value="curStadium.name || ''" placeholder="全部"/> |
|||
<image class="sf-img" mode="aspectFit" src="../../static/images/arrow.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { ORDER_API } from '../../js/api'; |
|||
import server from '../../js/server'; |
|||
export default { |
|||
props: { |
|||
visibled: { |
|||
type: Boolean, |
|||
default: false |
|||
} |
|||
}, |
|||
data(){ |
|||
return { |
|||
stadiumList: [ |
|||
{ id: '', name: '全部' } |
|||
], |
|||
curStadium: {} |
|||
} |
|||
}, |
|||
methods: { |
|||
pickerChange(e){ |
|||
let { value } = e.detail; |
|||
let { stadiumList } = this; |
|||
this.curStadium = stadiumList[value]; |
|||
this.$emit('change:stadium', this.curStadium); |
|||
}, |
|||
// 获取品牌店铺列表 |
|||
getStadiumList(brand_id){ |
|||
return server.get({ |
|||
url: ORDER_API.stadiumList, |
|||
data: { brand_id }, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
let _data = res?.data || {}; |
|||
if(_data.code === 0){ |
|||
let _list = _data?.data?.list || []; |
|||
return this.stadiumList = [ ...this.stadiumList, ..._list ]; |
|||
}else{ |
|||
console.warn('getStoreList err:', err); |
|||
return this.stadiumList; |
|||
} |
|||
}) |
|||
.catch(err=>{ |
|||
console.warn('getStoreList err:', err); |
|||
return this.stadiumList; |
|||
}) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.stadium-select{ |
|||
padding: 0 24upx; |
|||
height: 144upx; |
|||
background-color: #fff; |
|||
@include ctf(space-between); |
|||
.ss-txt{ |
|||
margin-right: 20upx; |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 40upx, #9c9c9f); |
|||
} |
|||
.ss-picker{ |
|||
flex-grow: 1; |
|||
.ss-frame{ |
|||
padding: 0 20upx; |
|||
height: 92upx; |
|||
border-radius: 10upx; |
|||
background-color: #F2F2F7; |
|||
@include ctf(space-between); |
|||
.sf-ipt{ |
|||
flex-grow: 1; |
|||
@include flcw(28upx, 40upx, #1a1a1a); |
|||
@include tHide(1); |
|||
} |
|||
.sf-img{ |
|||
margin-left: 10upx; |
|||
flex-shrink: 0; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.ocs-store{ |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,24 @@ |
|||
<template> |
|||
<fixed-bar> |
|||
<view class="bottom-fixed"> |
|||
<slot></slot> |
|||
</view> |
|||
</fixed-bar> |
|||
</template> |
|||
|
|||
<script> |
|||
import fixed_bar from "@/components/fixed_bar/fixed_bar.vue"; |
|||
export default { |
|||
components: { |
|||
'fixed-bar': fixed_bar |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.bottom-fixed{ |
|||
padding: 10upx 24upx; |
|||
background: #F2F2F7; |
|||
@include ctf(flex-end); |
|||
} |
|||
</style> |
@ -0,0 +1,261 @@ |
|||
<template> |
|||
<view class="end-billing-modal"> |
|||
<view class="ebm-mask" v-show="isShow"> |
|||
<view class="em-container"> |
|||
<view class="ec-close" @click="isShow = false"></view> |
|||
<view class="ec-title">结束计费</view> |
|||
<view class="ec-info"> |
|||
<view class="ei-line"><text class="el-txt">操作人:</text>{{ info.operator || '-' }}</view> |
|||
<view class="ei-line"><text class="el-txt">时长合计:</text>{{ info.duration || '-' }}</view> |
|||
<view class="ei-line"><text class="el-txt">金额合计:</text>{{ info.amount || '-' }}</view> |
|||
</view> |
|||
|
|||
<view class="ec-opts"> |
|||
<view |
|||
class="eo-item" |
|||
:class="{ active: end_type === 'end_timing' }" |
|||
@click="end_type = 'end_timing'" |
|||
> |
|||
<view class="ei-icon"></view> |
|||
<view class="ei-txt">停止计时</view> |
|||
</view> |
|||
<view |
|||
class="eo-item" |
|||
:class="{ active: end_type === 'end_order' }" |
|||
@click="end_type = 'end_order'" |
|||
> |
|||
<view class="ei-icon"></view> |
|||
<view class="ei-txt">完结订单</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<view class="ec-amount"> |
|||
<view class="et-name"><text class="en-txt">*</text>请输入金额</view> |
|||
<input type="digit" class="ea-ipt" v-model="amount"> |
|||
</view> |
|||
|
|||
<view class="ec-btn" @click="confirmBtn">确认</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { ORDER_API } from '../../../../js/api'; |
|||
import server from '../../../../js/server'; |
|||
import { showLoad, hideLoad, formatDate, showNone } from '@/utils/util'; |
|||
export default { |
|||
data(){ |
|||
return { |
|||
isShow: false, |
|||
info: { |
|||
// operator: '张三', |
|||
// duration: '1小时25分9秒', |
|||
// amount: '¥100.2' |
|||
}, |
|||
end_type: 'end_timing', // end_timing/ end_order |
|||
amount: '', |
|||
initOptions: {} |
|||
} |
|||
}, |
|||
methods: { |
|||
show(){ |
|||
this.isShow = true; |
|||
}, |
|||
hide(){ |
|||
this.isShow = false; |
|||
}, |
|||
initModal(data){ |
|||
let { operator, duration, amount, ...opts } = data; |
|||
this.info.operator = operator || ''; |
|||
this.info.duration = duration || ''; |
|||
this.info.amount = amount || ''; |
|||
this.initOptions = opts; |
|||
this.show(); |
|||
}, |
|||
async confirmBtn(){ |
|||
let { end_type, amount, initOptions } = this; |
|||
// initOptions?.success?.({ type: end_type, amount: +amount || 0 }); |
|||
// this.hide(); |
|||
try{ |
|||
let { end_type, amount, initOptions } = this; |
|||
showLoad(); |
|||
let _query = { |
|||
brand_id: initOptions?.brand_id || '', |
|||
order_no: initOptions?.order_no || '', |
|||
end_type, |
|||
pay_amount: +amount || 0 |
|||
}; |
|||
let _rRes = await this.cancelReq(_query); |
|||
hideLoad(); |
|||
if(_rRes === 'end_success'){ |
|||
showNone('操作成功!'); |
|||
initOptions?.success?.(_query); |
|||
this.hide(); |
|||
}else{ |
|||
throw new Error(_rRes); |
|||
} |
|||
|
|||
}catch(err){ |
|||
hideLoad(); |
|||
showNone('操作失败!'); |
|||
console.warn('end billing modal confirmBtn err -->', err); |
|||
initOptions?.fail?.(err); |
|||
} |
|||
}, |
|||
cancelReq({ |
|||
brand_id, order_no, pay_amount, end_type |
|||
}){ |
|||
return server.get({ |
|||
url: ORDER_API.timeOrderEnd, |
|||
data: { |
|||
brand_id, order_no, pay_amount, end_type |
|||
}, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
return 'end_success'; |
|||
}) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.ebm-mask{ |
|||
position: fixed; |
|||
top: 0; |
|||
left: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
background: rgba(0, 0, 0, 0.5); |
|||
|
|||
} |
|||
.em-container{ |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding: 0upx 80upx; |
|||
width: 620upx; |
|||
height: 806upx; |
|||
border-radius: 10upx; |
|||
background: #fff; |
|||
.ec-close{ |
|||
position: absolute; |
|||
right: 30upx; |
|||
top: 30upx; |
|||
width: 48upx; |
|||
height: 48upx; |
|||
transform: rotate(45deg); |
|||
&::before, &::after{ |
|||
content: ''; |
|||
display: block; |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
width: 100%; |
|||
height: 4upx; |
|||
background: #9a9a9d; |
|||
border-radius: 4upx; |
|||
} |
|||
&::after{ |
|||
transform: translate(-50%, -50%) rotate(90deg); |
|||
} |
|||
} |
|||
|
|||
.ec-title{ |
|||
padding-top: 78upx; |
|||
text-align: center; |
|||
@include flcw(32upx, 44upx, #1A1A1A, 500); |
|||
} |
|||
|
|||
.ec-btn{ |
|||
margin: 60upx auto 0upx; |
|||
width: 240upx; |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
background: $mColor; |
|||
@include flcw(32upx, 88upx, #fff, 500); |
|||
} |
|||
|
|||
} |
|||
|
|||
.ec-info{ |
|||
padding-top: 34upx; |
|||
.ei-line{ |
|||
@include flcw(28upx, 48upx, #1A1A1A); |
|||
@include tHide; |
|||
.el-txt{ |
|||
color: #1A1A1A; |
|||
} |
|||
&:nth-child(2){ |
|||
color: $mColor; |
|||
} |
|||
&:nth-child(3){ |
|||
color: #FF873D; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.ec-opts{ |
|||
padding-top: 58upx; |
|||
@include ctf(space-between); |
|||
.eo-item{ |
|||
flex-shrink: 0; |
|||
width: 50%; |
|||
@include ctf; |
|||
.ei-icon{ |
|||
flex-shrink: 0; |
|||
margin-right: 12upx; |
|||
padding: 4upx; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
border: 4upx solid #d8d8d8; |
|||
border-radius: 50%; |
|||
@include ctf(center); |
|||
|
|||
} |
|||
.ei-txt{ |
|||
@include flcw(28upx, 48upx, #d8d8d8); |
|||
} |
|||
&.active{ |
|||
.ei-icon{ |
|||
border-color: $mColor; |
|||
&::after{ |
|||
content: ''; |
|||
display: block; |
|||
width: 100%; |
|||
height: 100%; |
|||
background: $mColor; |
|||
border-radius: 50%; |
|||
} |
|||
} |
|||
.ei-txt{ |
|||
color: #1A1A1A; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.ec-amount{ |
|||
padding-top: 48upx; |
|||
.et-name{ |
|||
@include flcw(28upx, 48upx, #1A1A1A); |
|||
.en-txt{ |
|||
color: #EA5061; |
|||
} |
|||
} |
|||
.ea-ipt{ |
|||
margin-top: 8upx; |
|||
padding: 0 12upx; |
|||
height: 88upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid #D8D8D8; |
|||
@include flcw(28upx, 48upx, #1A1A1A); |
|||
} |
|||
|
|||
} |
|||
</style> |
@ -0,0 +1,43 @@ |
|||
<template> |
|||
<view class="order-detail-header"> |
|||
<view class="odh-stadium"> |
|||
<image class="os-img" mode="aspectFit" :src="stadiumLogo"></image> |
|||
<view class="os-name">{{ stadiumName || '-' }}</view> |
|||
</view> |
|||
<view class="odh-content"> |
|||
<slot>content</slot> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: [ 'stadiumName', 'stadiumLogo' ] |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.order-detail-header{ |
|||
padding: 0 30upx 40upx; |
|||
border-radius: 10upx; |
|||
background: #fff; |
|||
.odh-stadium{ |
|||
padding: 26upx 0; |
|||
border-bottom: 1px solid #D8D8D8; |
|||
@include ctf(flex-start); |
|||
.os-img{ |
|||
flex-shrink: 0; |
|||
margin-right: 14upx; |
|||
width: 40upx; |
|||
height: 40upx; |
|||
} |
|||
.os-name{ |
|||
@include flcw(28upx, 40upx, #333333, 500); |
|||
@include tHide; |
|||
} |
|||
} |
|||
.odh-content{ |
|||
padding-top: 26upx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,34 @@ |
|||
<template> |
|||
<view class="order-detail-info"> |
|||
<view class="odi-title">{{ title }}</view> |
|||
<view class="odi-content"> |
|||
<slot name="default">content</slot> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
title: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.order-detail-info{ |
|||
padding: 30upx; |
|||
border-radius: 10upx; |
|||
background: #fff; |
|||
.odi-title{ |
|||
@include flcw(28upx, 40upx, #9C9C9F); |
|||
@include tHide; |
|||
} |
|||
.odi-content{ |
|||
padding-top: 20upx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,58 @@ |
|||
<template> |
|||
<list-item-temp |
|||
:stadium="order.stadium_name || ''" |
|||
:status="order.status_text || ''" |
|||
:price="order.pay_amount || ''" |
|||
:price-show="true" |
|||
@click:item="toDetail" |
|||
> |
|||
<template v-slot:default> |
|||
<view class="lc-info"> |
|||
<kv-line label="订单编号:"> |
|||
<template v-slot:default>{{ order.order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<image class="li-icon" src="../../../../static/images/arrow.png"></image> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="项目类型:">{{ order.project_type_name || '-' }}</kv-line> |
|||
<kv-line label="创建时间:">{{ order.created_at || '-' }}</kv-line> |
|||
</view> |
|||
</template> |
|||
</list-item-temp> |
|||
</template> |
|||
|
|||
<script> |
|||
import kvLine from "../../../../components/kv_line.vue"; |
|||
import listItemTemp from "./item_temp.vue"; |
|||
import { routeTo } from '@/utils/util'; |
|||
export default { |
|||
props: { |
|||
order: { |
|||
type: Object, |
|||
default: () => ({}) |
|||
} |
|||
}, |
|||
components: { |
|||
'kv-line': kvLine, |
|||
'list-item-temp': listItemTemp |
|||
}, |
|||
methods: { |
|||
toDetail(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/deposit?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}`, 'nT'); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.lc-info{ |
|||
padding-top: 12upx; |
|||
.li-icon{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,68 @@ |
|||
<template> |
|||
<view class="list-item-temp" @click="$emit('click:item')"> |
|||
<view class="lit-stadium-status"> |
|||
<view class="lss-stadium">{{ stadium || '' }}</view> |
|||
<view |
|||
class="lss-status" |
|||
:class="{ active: statusActive }" |
|||
>{{ status }}</view> |
|||
</view> |
|||
<slot name="default">content</slot> |
|||
<view class="lit-price" v-if="priceShow"> |
|||
<text class="lp-txt">支付金额</text>¥{{ price || 0 }} |
|||
</view> |
|||
<slot name="bottom"></slot> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
stadium: String, |
|||
status: String, |
|||
price: String, |
|||
statusActive: Boolean, |
|||
priceShow: Boolean |
|||
}, |
|||
data(){ |
|||
return{ } |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.list-item-temp{ |
|||
padding: 0 20upx 30upx; |
|||
border-radius: 10upx; |
|||
background: #fff; |
|||
.lit-stadium-status{ |
|||
padding: 30upx 0 26upx; |
|||
border-bottom: 1px solid #D8D8D8; |
|||
@include ctf(space-between); |
|||
.lss-stadium{ |
|||
@include flcw(28upx, 40upx, #1A1A1A, 500); |
|||
@include tHide; |
|||
} |
|||
.lss-status{ |
|||
flex-shrink: 0; |
|||
margin-left: 12upx; |
|||
@include flcw(28upx, 40upx, #9A9A9D); |
|||
&.active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
} |
|||
.lit-price{ |
|||
margin-top: 30upx; |
|||
padding-top: 20upx; |
|||
text-align: right; |
|||
border-top: 1px solid #D8D8D8; |
|||
@include flcw(28upx, 40upx, #1A1A1A); |
|||
@include tHide; |
|||
.lp-txt{ |
|||
margin-right: 6upx; |
|||
color: #9C9C9F; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,84 @@ |
|||
<template> |
|||
<list-item-temp |
|||
:stadium="order.stadium_name || ''" |
|||
:status="order.status_text || ''" |
|||
:price="order.pay_amount || ''" |
|||
:status-active="['待支付', '计费中'].includes(order.status_text)" |
|||
:price-show="['待支付', '已完成', '已退款'].includes(order.status_text)" |
|||
@click:item="toDetail" |
|||
> |
|||
<template v-slot:default> |
|||
<view class="lc-info"> |
|||
<kv-line label="订单编号:"> |
|||
<template v-slot:default>{{ order.order_no || '' }}</template> |
|||
<template v-slot:right> |
|||
<image class="li-icon" src="../../../../static/images/arrow.png"></image> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="项目类型:">人时({{ order.project_type_name || '-' }})</kv-line> |
|||
<kv-line label="计费时长:"> |
|||
<text :style="order.status_text === '计费中' ? 'color: #009874;' : ''">{{ (order.extension&&order.extension.duration) || '' }}</text> |
|||
</kv-line> |
|||
<kv-line label="创建时间:">{{ order.created_at || '' }}</kv-line> |
|||
</view> |
|||
</template> |
|||
<template v-slot:bottom v-if="order.status_text === '计费中'"> |
|||
<view class="lc-btns"> |
|||
<view class="lb-item" @click.stop="endBilling">结束计费</view> |
|||
</view> |
|||
</template> |
|||
</list-item-temp> |
|||
</template> |
|||
|
|||
<script> |
|||
import kvLine from "../../../../components/kv_line.vue"; |
|||
import listItemTemp from "./item_temp.vue"; |
|||
import { routeTo } from '@/utils/util'; |
|||
export default { |
|||
props: { |
|||
order: { |
|||
type: Object, |
|||
default: () => ({}) |
|||
} |
|||
}, |
|||
components: { |
|||
'kv-line': kvLine, |
|||
'list-item-temp': listItemTemp |
|||
}, |
|||
methods: { |
|||
toDetail(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/person?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}`, 'nT'); |
|||
}, |
|||
endBilling(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/person?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}&is_end=1`, 'nT'); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.lc-info{ |
|||
padding-top: 12upx; |
|||
.li-icon{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
} |
|||
} |
|||
|
|||
.lc-btns{ |
|||
margin-top: 24upx; |
|||
@include ctf(flex-end); |
|||
.lb-item{ |
|||
width: 192upx; |
|||
height: 80upx; |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
border: 2upx solid $mColor; |
|||
@include flcw(32upx, 76upx, $mColor, 500); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,94 @@ |
|||
<template> |
|||
<list-item-temp |
|||
:stadium="order.stadium_name || ''" |
|||
:status="order.status_text || ''" |
|||
:price="order.pay_amount || ''" |
|||
:status-active="['待支付', '计费中','待使用', '使用中'].includes(order.status_text)" |
|||
:price-show="['待支付', '待使用', '使用中', '已完成', '已失效', '已退款'].includes(order.status_text)" |
|||
@click:item="toDetail" |
|||
> |
|||
<template v-slot:default> |
|||
<view class="lc-info"> |
|||
<kv-line label="项目类型:"> |
|||
<template v-slot:default>{{ order.project_type_name || '-' }}</template> |
|||
<template v-slot:right> |
|||
<image class="li-icon" src="../../../../static/images/arrow.png"></image> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="开始时间:">{{ order.start_time || '-' }}</kv-line> |
|||
<kv-line label="结束时间:">{{ order.end_time || '-' }}</kv-line> |
|||
<kv-line label="时长合计:"> |
|||
<text :style="order.status_text === '计费中' ? 'color: #009874;' : ''">{{ (order.extension&&order.extension.duration) || '' }}</text> |
|||
</kv-line> |
|||
<kv-line label="创建时间:">{{ order.created_at || '-' }}</kv-line> |
|||
|
|||
</view> |
|||
</template> |
|||
<template v-slot:bottom> |
|||
<view class="lc-btns"> |
|||
<view class="lb-item" v-if="order.status_text === '待使用'" @click.stop="cancelBtn">取消预约</view> |
|||
<view class="lb-item" v-if="order.status_text === '计费中'" @click.stop="endBilling">结束计费</view> |
|||
</view> |
|||
</template> |
|||
</list-item-temp> |
|||
</template> |
|||
|
|||
<script> |
|||
import kvLine from "../../../../components/kv_line.vue"; |
|||
import listItemTemp from "./item_temp.vue"; |
|||
import { routeTo } from '@/utils/util'; |
|||
export default { |
|||
props: { |
|||
order: { |
|||
type: Object, |
|||
default: () => ({}) |
|||
} |
|||
}, |
|||
components: { |
|||
'kv-line': kvLine, |
|||
'list-item-temp': listItemTemp |
|||
}, |
|||
methods: { |
|||
toDetail(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/site?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}`, 'nT'); |
|||
}, |
|||
endBilling(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/site?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}&is_end=1`, 'nT'); |
|||
}, |
|||
cancelBtn(){ |
|||
let { order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/site?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}&is_end=2`, 'nT'); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.lc-info{ |
|||
padding-top: 12upx; |
|||
.li-icon{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
} |
|||
} |
|||
|
|||
.lc-btns{ |
|||
margin-top: 24upx; |
|||
@include ctf(flex-end); |
|||
.lb-item{ |
|||
width: 192upx; |
|||
height: 80upx; |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
border: 2upx solid $mColor; |
|||
@include flcw(32upx, 76upx, $mColor, 500); |
|||
&+.lb-item{ |
|||
margin-left: 24upx; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,62 @@ |
|||
<template> |
|||
<view class="search-bar"> |
|||
<view class="sb-box"> |
|||
<image class="sb-search-icon" mode="aspectFit" src="/subpackage/order/static/images/search.png"></image> |
|||
<input class="sb-ipt" placeholder="你输入订单号" v-model="searchTxt" confirm-type="search" @confirm="iptConfirm" /> |
|||
<image class="sb-clear-icon" v-if="searchTxt!=''" mode="aspectFit" src="/subpackage/order/static/images/round_close.png" @click="clearSearch"></image> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
searchTxt: '' |
|||
} |
|||
}, |
|||
methods: { |
|||
iptConfirm(){ |
|||
this.$emit('confirm:search', this.searchTxt); |
|||
}, |
|||
clearSearch(){ |
|||
this.searchTxt = ''; |
|||
this.$emit('click:clear', ''); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.search-bar{ |
|||
margin-bottom: 24upx; |
|||
height: 144upx; |
|||
background-color: #fff; |
|||
@include ctf(center); |
|||
.sb-box{ |
|||
padding: 0 20upx; |
|||
height: 92upx; |
|||
width: 702upx; |
|||
border-radius: 10upx; |
|||
background-color: #f2f2f7; |
|||
@include ctf(center); |
|||
.sb-search-icon{ |
|||
margin-right: 20upx; |
|||
flex-shrink: 0; |
|||
width: 40upx; |
|||
height: 40upx; |
|||
} |
|||
.sb-clear-icon{ |
|||
flex-shrink: 0; |
|||
margin-right: 0; |
|||
margin-left: 20upx; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
} |
|||
.sb-ipt{ |
|||
flex-grow: 1; |
|||
@include flcw(32upx, 44upx, #1A1A1A); |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,126 @@ |
|||
import { ORDER_API } from '../../../js/api'; |
|||
import server from '../../../js/server'; |
|||
import { showLoad, hideLoad, showNone, showModal } from '@/utils/util'; |
|||
|
|||
|
|||
// 获取订单详情
|
|||
export function getOrderDetail({ |
|||
brand_id = '', order_no = '' |
|||
}){ |
|||
showLoad(); |
|||
return server.get({ |
|||
url: ORDER_API.billingOrderDetail, |
|||
data: { |
|||
brand_id, order_no |
|||
}, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
// this.orderInfo = res || {};
|
|||
return res; |
|||
}) |
|||
.catch(err=>{ |
|||
hideLoad(); |
|||
showNone('加载失败!'); |
|||
console.warn('getOrderDetail err -->', err); |
|||
}) |
|||
} |
|||
|
|||
// 完结订单
|
|||
export function endOrderServer({ |
|||
brand_id, order_no, stadium_id |
|||
}){ |
|||
showLoad(); |
|||
return server.get({ |
|||
url: ORDER_API.timeOrderComplete, |
|||
data: { |
|||
brand_id, order_no, stadium_id |
|||
}, |
|||
failMsg: '操作失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
showNone('操作成功!'); |
|||
return res; |
|||
}) |
|||
.catch(err=>{ |
|||
hideLoad(); |
|||
showNone('操作失败!'); |
|||
console.warn('endOrderServer err -->', err); |
|||
}) |
|||
} |
|||
|
|||
// 取消订单
|
|||
export function cancelOrderServer({ |
|||
brand_id, order_no, reason = '' |
|||
}){ |
|||
showLoad(); |
|||
return server.get({ |
|||
url: ORDER_API.subscribeCancel, |
|||
data: { |
|||
brand_id, order_no, reason |
|||
}, |
|||
failMsg: '操作失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
showNone('操作成功!'); |
|||
return res; |
|||
}) |
|||
.catch(err=>{ |
|||
hideLoad(); |
|||
showNone('操作失败!'); |
|||
console.warn('cancelOrderServer err -->', err); |
|||
|
|||
}) |
|||
} |
|||
|
|||
// 完结订单弹窗
|
|||
export function finishOrder({ |
|||
brand_id, order_no, stadium_id, opts = {} |
|||
}){ |
|||
showModal({ |
|||
title: '提示', |
|||
content: '是否确认完结订单?', |
|||
showCancel: true, |
|||
success: modalRes=>{ |
|||
if(modalRes.confirm)endOrderServer({ |
|||
brand_id: brand_id || '', |
|||
order_no: order_no || '', |
|||
stadium_id: stadium_id || '' |
|||
}) |
|||
.finally(res=>{ |
|||
// setTimeout(()=>{
|
|||
// this.getOrderDetail({
|
|||
// brand_id: brand_id || '',
|
|||
// order_no: order_no || ''
|
|||
// });
|
|||
// }, 1000);
|
|||
opts?.finally?.(res); |
|||
}); |
|||
} |
|||
}) |
|||
} |
|||
|
|||
export function siteAndPeopleRefundServer({ order_no = '', amount = 0, integral = 0 }){ |
|||
showLoad(); |
|||
return server.post({ |
|||
url: ORDER_API.orderRefund, |
|||
data: { |
|||
order_no, amount, integral |
|||
}, |
|||
failMsg: '操作失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
showNone('操作成功!'); |
|||
// this.orderInfo = res || {};
|
|||
return 'success'; |
|||
}) |
|||
.catch(err=>{ |
|||
hideLoad(); |
|||
showNone('操作失败!'); |
|||
console.warn('getOrderDetail err -->', err); |
|||
}) |
|||
} |
@ -0,0 +1,211 @@ |
|||
<template> |
|||
<view class="deposit-order-detail"> |
|||
<header-temp |
|||
:stadium-name="orderInfo.stadium_name" |
|||
:stadium-logo="orderInfo.stadium_logo" |
|||
> |
|||
<kv-line label="订单编号:"> |
|||
<template v-slot:default>{{ orderInfo.order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<text class="dod-status">{{ orderInfo.status_text || '-' }}</text> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="创建时间:">{{ orderInfo.created_at || '-' }}</kv-line> |
|||
<kv-line label="手机号码:">{{ orderInfo.mobile || '-' }}</kv-line> |
|||
<kv-line label="用户昵称:">{{ orderInfo.nickname || '-' }}</kv-line> |
|||
<kv-line label="订单来源:">{{ orderInfo.source || '-' }}</kv-line> |
|||
<kv-line label="订单备注:">{{ orderInfo.desc || '-' }}</kv-line> |
|||
</header-temp> |
|||
|
|||
<view class="od-margin"></view> |
|||
<info-temp title="订单信息"> |
|||
<kv-line label="项目类型:">{{ orderInfo.project_type_name || '-' }}</kv-line> |
|||
<kv-line label="押金金额:">{{ orderInfo.amount || '0' }}</kv-line> |
|||
|
|||
<view class="od-pay-info"> |
|||
<kvs-line label="金额小计">¥{{ orderInfo.amount || '0' }}</kvs-line> |
|||
<kvs-line label="折扣金额">-¥{{ orderInfo.discount_amount || '0' }}</kvs-line> |
|||
<kvs-line label="积分抵扣">-¥{{ orderInfo.deduction_amount || '0' }}</kvs-line> |
|||
<kvs-line label="优惠券优惠">-¥{{ orderInfo.coupons_amount || '0' }}</kvs-line> |
|||
</view> |
|||
<view class="od-total"> |
|||
<text class="ot-name">合计支付:</text>¥{{ orderInfo.pay_amount || '0' }} |
|||
</view> |
|||
</info-temp> |
|||
|
|||
<view class="od-margin"></view> |
|||
<info-temp title="关联押金订单"> |
|||
<kv-line label="押金订单号:"> |
|||
<template v-slot:default>{{ link_order.order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<text class="od-check" @click="toTimingOrder">查看计时订单</text> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="押金金额:">¥{{ orderInfo.amount || '-' }}</kv-line> |
|||
<kv-line label="订单状态:">{{ orderInfo.status_text || '-' }}</kv-line> |
|||
</info-temp> |
|||
|
|||
<view class="od-margin"></view> |
|||
<info-temp title="支付信息"> |
|||
<kv-line label="支付方式:">{{ orderInfo.pay_type_text || '-' }}</kv-line> |
|||
<kv-line label="支付时间:">{{ orderInfo.pay_time || '-' }}</kv-line> |
|||
<kv-line label="交易流水:">{{ orderInfo.trade_no || '-' }}</kv-line> |
|||
</info-temp> |
|||
|
|||
<!-- 退款列表 --> |
|||
<view v-for="(e, i) in refundList" :key="i"> |
|||
<view class="od-margin"></view> |
|||
<order-refund-info |
|||
:refund_price="e.amount || 0" |
|||
:refund_no="e.refund_no || '-'" |
|||
:refund_time="e.refund_time || '-'" |
|||
:refund_reason="e.reason || '-'" |
|||
:nameKey="i + 1" |
|||
></order-refund-info> |
|||
</view> |
|||
|
|||
<bottom-fixed v-if="[ '已完成', '已退款', '已抵扣' ].includes(orderInfo.status_text)"> |
|||
<refund-button |
|||
:pay_amount="orderInfo.pay_amount" |
|||
:refund_amount="orderInfo.refund_amount" |
|||
:refund_times="refundList.length || 0" |
|||
@click:button="refundOrder" |
|||
>退款</refund-button> |
|||
</bottom-fixed> |
|||
|
|||
<!-- 退款弹窗 --> |
|||
<order-refund-modal |
|||
ref="orderRefundModal" |
|||
></order-refund-modal> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import headerTemp from "../modules/order_detail/header_temp.vue"; |
|||
import infoTemp from "../modules/order_detail/info_temp.vue"; |
|||
import kvLine from "../../../components/kv_line.vue"; |
|||
import kvsLine from "../../../components/kvs_line.vue"; |
|||
|
|||
import bottomFixed from "../modules/order_detail/bottom_fixed.vue"; |
|||
import refundButton from "@/components/order_refund/permission_btn.vue"; |
|||
import orderRefundModal from '@/components/order_refund/modal.vue'; |
|||
import orderRefundInfo from '@/components/order_refund/info.vue'; |
|||
|
|||
import { getOrderDetail, siteAndPeopleRefundServer } from "./common"; |
|||
export default { |
|||
components: { |
|||
'header-temp': headerTemp, |
|||
'info-temp': infoTemp, |
|||
'kv-line': kvLine, |
|||
'kvs-line': kvsLine, |
|||
|
|||
'bottom-fixed': bottomFixed, |
|||
'refund-button': refundButton, |
|||
'order-refund-modal': orderRefundModal, |
|||
'order-refund-info': orderRefundInfo |
|||
}, |
|||
computed: { |
|||
link_order(){ |
|||
let { orderInfo } = this; |
|||
return orderInfo?.extension?.link_order || {}; |
|||
}, |
|||
extension(){ |
|||
return this.orderInfo?.extension || {}; |
|||
} |
|||
}, |
|||
data(){ |
|||
return { |
|||
orderInfo: {}, |
|||
refundList: [] |
|||
} |
|||
}, |
|||
async onLoad(options){ |
|||
this.getOrderDetail({ |
|||
brand_id: options?.brand_id || '', |
|||
order_no: options?.order_no || '' |
|||
}) |
|||
}, |
|||
methods: { |
|||
refundOrder(){ |
|||
let { orderInfo, extension, refundList } = this; |
|||
this.$refs.orderRefundModal.show({ |
|||
stadium_name: orderInfo?.stadium_name ?? '', |
|||
order_no: orderInfo?.order_no ?? '', |
|||
mobile: orderInfo?.mobile ?? '', |
|||
refundable_amount: extension?.refundable_amount ?? 0, |
|||
refundable_integral: extension?.refundable_integral ?? 0, |
|||
refund_times: refundList?.length || -1, |
|||
confirm: e => { |
|||
console.log('e', e) |
|||
siteAndPeopleRefundServer({ |
|||
order_no: orderInfo?.order_no || '', |
|||
amount: e?.refund_amount || 0, |
|||
integral: e?.refund_integral || 0, |
|||
}) |
|||
.finally(()=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id || '', |
|||
order_no: orderInfo?.order_no || '' |
|||
}); |
|||
}, 1000); |
|||
}) |
|||
} |
|||
}); |
|||
}, |
|||
toTimingOrder(){ |
|||
let { order, link_order } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/site?order_no=${link_order?.order_no || ''}&brand_id=${order?.brand_id || ''}`, 'rT'); |
|||
}, |
|||
// 获取订单详情 |
|||
async getOrderDetail({ brand_id = '', order_no = '' }){ |
|||
let _detail = await getOrderDetail({ brand_id, order_no }); |
|||
this.orderInfo = _detail || {}; |
|||
this.getRefundData({ order_no }); |
|||
return _detail; |
|||
}, |
|||
// 获取退款信息 |
|||
async getRefundData({ order_no }){ |
|||
let _refundRes = await this.$store.dispatch('getOrderRefundList', order_no); |
|||
let _refundLs = _refundRes?.data?.data?.list || []; |
|||
this.refundList = _refundLs; |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.deposit-order-detail{ |
|||
padding: 24upx; |
|||
.dod-status{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 40upx, #9C9C9F); |
|||
} |
|||
|
|||
.od-margin{ |
|||
height: 24upx; |
|||
background: transparent; |
|||
} |
|||
.od-pay-info{ |
|||
margin-top: 20upx; |
|||
border-top: 1px solid #D8D8D8; |
|||
} |
|||
.od-total{ |
|||
padding-top: 10upx; |
|||
text-align: right; |
|||
@include flcw(28upx, 50upx, #1A1A1A, 500); |
|||
@include tHide; |
|||
.ot-name{ |
|||
color: #9A9A9D; |
|||
font-weight: 400; |
|||
} |
|||
} |
|||
.od-check{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
@include flcw(24upx, 40upx, $mColor); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,268 @@ |
|||
<template> |
|||
<view class="person-order-detail"> |
|||
<header-temp |
|||
:stadium-name="orderInfo.stadium_name" |
|||
:stadium-logo="orderInfo.stadium_logo" |
|||
> |
|||
<kv-line label="订单编号:"> |
|||
<template v-slot:default>{{ orderInfo.order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<text |
|||
class="pod-status" |
|||
:class="{ active: [ '计费中', '待支付' ].includes(orderInfo.status_text) }" |
|||
>{{ orderInfo.status_text || '-' }}</text> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="创建时间:">{{ orderInfo.created_at || '-' }}</kv-line> |
|||
<kv-line label="手机号码:">{{ orderInfo.mobile || '-' }}</kv-line> |
|||
<kv-line label="用户昵称:">{{ orderInfo.nickname || '-' }}</kv-line> |
|||
</header-temp> |
|||
|
|||
<view class="pod-margin"></view> |
|||
<info-temp title="计时信息"> |
|||
<kv-line label="项目类型:">人时({{ orderInfo.project_type_name || '-' }})</kv-line> |
|||
<kv-line label="进场时间:">{{ orderInfo.start_time || '-' }}</kv-line> |
|||
<kv-line label="离场时间:">{{ orderInfo.end_time || '-' }}</kv-line> |
|||
<kv-line label="时长合计:">{{ extension.duration || '-' }}</kv-line> |
|||
<block v-if="[ '已完成', '已退款', '待支付' ].includes(orderInfo.status_text)"> |
|||
<view class="pod-pay-info"> |
|||
<kvs-line label="金额小计">¥{{ orderInfo.amount || '0' }}</kvs-line> |
|||
<kvs-line label="折扣金额">-¥{{ orderInfo.discount_amount || '0' }}</kvs-line> |
|||
<kvs-line label="积分抵扣">-¥{{ orderInfo.deduction_amount || '0' }}</kvs-line> |
|||
<kvs-line label="优惠券优惠">-¥{{ orderInfo.coupons_amount || '0' }}</kvs-line> |
|||
</view> |
|||
<view class="pod-total"> |
|||
<text class="pt-name">合计支付:</text>¥{{ orderInfo.pay_amount || '0' }} |
|||
</view> |
|||
</block> |
|||
</info-temp> |
|||
|
|||
<blcok v-if="[ '已完成', '已退款' ].includes(orderInfo.status_text)"> |
|||
<view class="pod-margin"></view> |
|||
<info-temp title="支付信息"> |
|||
<kv-line label="支付方式:">{{ orderInfo.pay_type_text || '-' }}</kv-line> |
|||
<kv-line label="支付时间:">{{ orderInfo.pay_time || '-' }}</kv-line> |
|||
<kv-line label="微信交易号:">{{ orderInfo.trade_no || '-' }}</kv-line> |
|||
</info-temp> |
|||
</blcok> |
|||
|
|||
<!-- 退款列表 --> |
|||
<view v-for="(e, i) in refundList" :key="i"> |
|||
<view class="pod-margin"></view> |
|||
<order-refund-info |
|||
:refund_price="e.amount || 0" |
|||
:refund_no="e.refund_no || '-'" |
|||
:refund_time="e.refund_time || '-'" |
|||
:refund_reason="e.reason || '-'" |
|||
:nameKey="i + 1" |
|||
></order-refund-info> |
|||
</view> |
|||
|
|||
<block v-if="[ '待支付', '计费中' ].includes(orderInfo.status_text)"> |
|||
<view class="pod-margin"></view> |
|||
<view class="pod-margin"></view> |
|||
<view |
|||
class="pod-btn" |
|||
v-if="orderInfo.status_text === '待支付'" |
|||
@click="finishOrder" |
|||
>完结订单</view> |
|||
<view |
|||
class="pod-btn" |
|||
v-if="orderInfo.status_text === '计费中'" |
|||
@click="endOrder" |
|||
>结束计费</view> |
|||
</block> |
|||
|
|||
<!-- <view class="pod-fixed"> |
|||
<view class="pf-btn">取消预约</view> |
|||
</view> --> |
|||
<bottom-fixed v-if="[ '已完成', '已退款' ].includes(orderInfo.status_text)"> |
|||
<refund-button |
|||
:pay_amount="orderInfo.pay_amount" |
|||
:refund_amount="orderInfo.refund_amount" |
|||
:refund_times="refundList.length || 0" |
|||
@click:button="refundOrder" |
|||
>退款</refund-button> |
|||
</bottom-fixed> |
|||
|
|||
<!-- 结束计费弹窗 --> |
|||
<end-billing-modal ref="endBillingModal"></end-billing-modal> |
|||
|
|||
<!-- 退款弹窗 --> |
|||
<order-refund-modal |
|||
ref="orderRefundModal" |
|||
></order-refund-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import headerTemp from "../modules/order_detail/header_temp.vue"; |
|||
import infoTemp from "../modules/order_detail/info_temp.vue"; |
|||
import kvLine from "../../../components/kv_line.vue"; |
|||
import kvsLine from "../../../components/kvs_line.vue"; |
|||
import endBillingModal from "../modules/order_detail/end_billing_modal.vue"; |
|||
|
|||
import bottomFixed from "../modules/order_detail/bottom_fixed.vue"; |
|||
import refundButton from "@/components/order_refund/permission_btn.vue"; |
|||
import orderRefundModal from '@/components/order_refund/modal.vue'; |
|||
import orderRefundInfo from '@/components/order_refund/info.vue'; |
|||
// import bottomFixed from "../modules/order_detail/bf_button.vue"; |
|||
|
|||
import { getOrderDetail, finishOrder, siteAndPeopleRefundServer } from "./common"; |
|||
export default { |
|||
components: { |
|||
'header-temp': headerTemp, |
|||
'info-temp': infoTemp, |
|||
'kv-line': kvLine, |
|||
'kvs-line': kvsLine, |
|||
'bottom-fixed': bottomFixed, |
|||
'end-billing-modal': endBillingModal, |
|||
'refund-button': refundButton, |
|||
'order-refund-modal': orderRefundModal, |
|||
'order-refund-info': orderRefundInfo |
|||
}, |
|||
computed: { |
|||
extension(){ |
|||
return this.orderInfo?.extension || {}; |
|||
} |
|||
}, |
|||
data(){ |
|||
return { |
|||
orderInfo: {}, |
|||
refundList: [] |
|||
} |
|||
}, |
|||
async onLoad(options){ |
|||
this.getOrderDetail({ |
|||
brand_id: options?.brand_id || '', |
|||
order_no: options?.order_no || '' |
|||
}) |
|||
.then(res=>{ |
|||
if(res?.status_text === '计费中'&&options?.is_end === '1'){ |
|||
this.endOrder(); |
|||
} |
|||
}); |
|||
}, |
|||
methods: { |
|||
refundOrder(){ |
|||
let { orderInfo, extension, refundList } = this; |
|||
this.$refs.orderRefundModal.show({ |
|||
stadium_name: orderInfo?.stadium_name ?? '', |
|||
order_no: orderInfo?.order_no ?? '', |
|||
mobile: orderInfo?.mobile ?? '', |
|||
refundable_amount: extension?.refundable_amount ?? 0, |
|||
refundable_integral: extension?.refundable_integral ?? 0, |
|||
refund_times: refundList?.length || -1, |
|||
confirm: e => { |
|||
console.log('e', e) |
|||
siteAndPeopleRefundServer({ |
|||
order_no: orderInfo?.order_no || '', |
|||
amount: e?.refund_amount || 0, |
|||
integral: e?.refund_integral || 0, |
|||
}) |
|||
.finally(()=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id || '', |
|||
order_no: orderInfo?.order_no || '' |
|||
}); |
|||
}, 1000); |
|||
}) |
|||
} |
|||
}); |
|||
}, |
|||
// 结束计费 |
|||
endOrder(){ |
|||
let { orderInfo } = this; |
|||
this.$refs.endBillingModal.initModal({ |
|||
operator: orderInfo?.end_bill_operator_name, |
|||
duration: orderInfo?.extension?.duration, |
|||
amount: orderInfo?.amount, |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no, |
|||
success: res=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no |
|||
}); |
|||
}, 1000); |
|||
} |
|||
}); |
|||
}, |
|||
|
|||
// // 完结订单弹窗 |
|||
finishOrder(){ |
|||
let { orderInfo } = this; |
|||
finishOrder({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no, |
|||
stadium_id: orderInfo?.stadium_id, |
|||
opts: { |
|||
finally: ()=> { |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no |
|||
}); |
|||
}, 1000); |
|||
} |
|||
} |
|||
}) |
|||
}, |
|||
|
|||
// 获取订单详情 |
|||
async getOrderDetail({ brand_id = '', order_no = '' }){ |
|||
let _detail = await getOrderDetail({ brand_id, order_no }); |
|||
this.orderInfo = _detail || {}; |
|||
this.getRefundData({ order_no }); |
|||
return _detail; |
|||
}, |
|||
// 获取退款信息 |
|||
async getRefundData({ order_no }){ |
|||
let _refundRes = await this.$store.dispatch('getOrderRefundList', order_no); |
|||
let _refundLs = _refundRes?.data?.data?.list || []; |
|||
this.refundList = _refundLs; |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.person-order-detail{ |
|||
padding: 24upx; |
|||
.pod-status{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 40upx, #9C9C9F); |
|||
&.active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
} |
|||
.pod-margin{ |
|||
height: 24upx; |
|||
background: transparent; |
|||
} |
|||
.pod-pay-info{ |
|||
margin-top: 20upx; |
|||
border-top: 1px solid #D8D8D8; |
|||
} |
|||
.pod-total{ |
|||
padding-top: 10upx; |
|||
text-align: right; |
|||
@include flcw(28upx, 50upx, #1A1A1A, 500); |
|||
@include tHide; |
|||
.pt-name{ |
|||
color: #9A9A9D; |
|||
font-weight: 400; |
|||
} |
|||
} |
|||
|
|||
.pod-btn{ |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
background: $mColor; |
|||
@include flcw(32upx, 112upx, #fff, 500); |
|||
} |
|||
</style> |
@ -0,0 +1,382 @@ |
|||
<template> |
|||
<view class="site-order-detail"> |
|||
<header-temp |
|||
:stadium-name="orderInfo.stadium_name" |
|||
:stadium-logo="orderInfo.stadium_logo" |
|||
> |
|||
<kv-line label="订单编号:"> |
|||
<template v-slot:default>{{ orderInfo.order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<text |
|||
class="od-status" |
|||
:class="[ '待使用', '使用中', '待支付', '计费中' ].includes(orderInfo.status_text) ? 'active' : ''" |
|||
>{{ orderInfo.status_text || '-' }}</text> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="创建时间:">{{ orderInfo.created_at || '-' }}</kv-line> |
|||
<kv-line label="手机号码:">{{ orderInfo.mobile || '-' }}</kv-line> |
|||
<kv-line label="用户昵称:">{{ orderInfo.nickname || '-' }}</kv-line> |
|||
</header-temp> |
|||
|
|||
<view class="od-margin"></view> |
|||
<info-temp title="场地计时信息"> |
|||
<kv-line label="项目类型:">({{ orderInfo.project_type_name || '-' }})</kv-line> |
|||
<kv-line label="进场时间:">{{ orderInfo.start_time || '-' }}</kv-line> |
|||
<kv-line |
|||
label="离场时间:" |
|||
v-if="[ '待使用', '已取消预约', '计费中', '使用中' ].includes(orderInfo.status_text)&&orderInfo.settlement_type === 1" |
|||
>现场扫码结算</kv-line> |
|||
<kv-line label="离场时间:" v-else>{{ orderInfo.end_time || '-' }}</kv-line> |
|||
<kv-line label="时长合计:">{{ orderInfo.extension&&orderInfo.extension.duration || '-' }}</kv-line> |
|||
|
|||
<block |
|||
v-if="orderInfo.settlement_type === 1 || [ '已完成', '已退款', '待支付', '已失效' ].includes(orderInfo.status_text)" |
|||
> |
|||
<view class="od-pay-info"> |
|||
<kvs-line label="金额小计">¥{{ orderInfo.amount || '0' }}</kvs-line> |
|||
<kvs-line label="折扣金额">-¥{{ orderInfo.discount_amount || '0' }}</kvs-line> |
|||
<kvs-line label="积分抵扣">-¥{{ orderInfo.deduction_amount || '0' }}</kvs-line> |
|||
<kvs-line label="优惠券优惠">-¥{{ orderInfo.coupons_amount || '0' }}</kvs-line> |
|||
</view> |
|||
<view class="od-total"> |
|||
<text class="pt-name">合计支付:</text>¥{{ orderInfo.pay_amount || '0' }} |
|||
</view> |
|||
</block> |
|||
</info-temp> |
|||
|
|||
<block v-if="extension.show_deposit"> |
|||
<view class="od-margin"></view> |
|||
<info-temp title="关联押金订单"> |
|||
<kv-line label="押金订单号:"> |
|||
<template v-slot:default>{{ orderInfo.deposit_order_no || '-' }}</template> |
|||
<template v-slot:right> |
|||
<text class="od-check" @click="toDepoistDetail">查看押金订单</text> |
|||
</template> |
|||
</kv-line> |
|||
<kv-line label="押金金额:">¥{{ extension.deposit_amount || '0' }}</kv-line> |
|||
<kv-line label="订单状态:"> |
|||
<template v-slot:default>{{ extension.deposit_status_text || '-' }}</template> |
|||
<!-- <template v-slot:right> |
|||
<text class="od-deposit-explain">(押金已原路退返账户,请留意查收!)</text> |
|||
</template> --> |
|||
</kv-line> |
|||
</info-temp> |
|||
</block> |
|||
|
|||
<block v-if="orderInfo.status_text === '已取消预约'"> |
|||
<view class="od-margin"></view> |
|||
<info-temp> |
|||
<kv-line label="取消时间:">{{ orderInfo.cancel_time || '-' }}</kv-line> |
|||
<kv-line label="取消原因:">{{ orderInfo.cancel_reason || '-' }}</kv-line> |
|||
</info-temp> |
|||
</block> |
|||
|
|||
<block v-if="orderInfo.settlement_type === 1 || [ '已完成', '已退款', '已失效' ].includes(orderInfo.status_text)"> |
|||
<view class="od-margin"></view> |
|||
<info-temp title="支付信息"> |
|||
<kv-line label="支付方式:">{{ orderInfo.pay_type_text || '-' }}</kv-line> |
|||
<kv-line label="支付时间:">{{ orderInfo.pay_time || '-' }}</kv-line> |
|||
<kv-line label="交易流水:">{{ orderInfo.trade_no || '-' }}</kv-line> |
|||
</info-temp> |
|||
</block> |
|||
|
|||
<block v-if="orderInfo.status_text === '计费中'"> |
|||
<view class="od-margin"></view> |
|||
<info-temp title="费用详情"> |
|||
<kv-line label="产生费用:"><text class="od-check">¥{{ orderInfo.amount || '0' }}</text></kv-line> |
|||
</info-temp> |
|||
</block> |
|||
|
|||
<!-- <view class="od-margin"></view> |
|||
<info-temp title="退款信息1"> |
|||
<kv-line label="退款金额:">¥998</kv-line> |
|||
<kv-line label="退款单号:">TF-20195171564566</kv-line> |
|||
<kv-line label="退款时间:">2019-05-17 11:12:58</kv-line> |
|||
<kv-line label="退款原因:">商家主动退款</kv-line> |
|||
</info-temp> |
|||
|
|||
<view class="od-margin"></view> |
|||
<info-temp title="退款信息2"> |
|||
<kv-line label="退款金额:">¥998</kv-line> |
|||
<kv-line label="退款单号:">TF-20195171564566</kv-line> |
|||
<kv-line label="退款时间:">2019-05-17 11:12:58</kv-line> |
|||
<kv-line label="退款原因:">商家主动退款</kv-line> |
|||
</info-temp> --> |
|||
<!-- 退款列表 --> |
|||
<view v-for="(e, i) in refundList" :key="i"> |
|||
<view class="od-margin"></view> |
|||
<order-refund-info |
|||
:refund_price="e.amount || 0" |
|||
:refund_no="e.refund_no || '-'" |
|||
:refund_time="e.refund_time || '-'" |
|||
:refund_reason="e.reason || '-'" |
|||
:nameKey="i + 1" |
|||
></order-refund-info> |
|||
</view> |
|||
|
|||
<block v-if="[ '待支付', '计费中', '待使用' ].includes(orderInfo.status_text)"> |
|||
<view class="od-margin"></view> |
|||
<view class="od-margin"></view> |
|||
<view |
|||
class="pod-btn" |
|||
v-if="orderInfo.status_text === '待支付'" |
|||
@click="finishOrder" |
|||
>完结订单</view> |
|||
<view |
|||
class="pod-btn" |
|||
v-if="orderInfo.status_text === '计费中'" |
|||
@click="endOrder" |
|||
>结束计费</view> |
|||
<view |
|||
class="pod-btn" |
|||
v-if="orderInfo.status_text === '待使用'" |
|||
@click="cancelOrder" |
|||
>取消预约</view> |
|||
</block> |
|||
|
|||
|
|||
<bottom-fixed v-if="[ '使用中', '已失效', '已完成', '已退款' ].includes(orderInfo.status_text)"> |
|||
<refund-button |
|||
:pay_amount="orderInfo.pay_amount" |
|||
:refund_amount="orderInfo.refund_amount" |
|||
:refund_times="refundList.length || 0" |
|||
@click:button="refundOrder" |
|||
>退款</refund-button> |
|||
</bottom-fixed> |
|||
|
|||
<!-- 结束计费弹窗 --> |
|||
<end-billing-modal ref="endBillingModal"></end-billing-modal> |
|||
|
|||
<!-- 退款弹窗 --> |
|||
<order-refund-modal ref="orderRefundModal" ></order-refund-modal> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
/* |
|||
这页面只是场时订单 |
|||
|
|||
type: |
|||
|
|||
2是人时 1 3是场时 |
|||
1是场时 3是场时的押金 |
|||
预约订单是另外一个字段判断 -> enable_subscribe |
|||
------------------ |
|||
enable_subscribe= true&&type= 1 --> 预约订单 |
|||
enable_subscribe= true&&type= 3 --> 预约的押金订单 |
|||
|
|||
settlement_type --> 结算方式[0离场结算1用前结算] |
|||
|
|||
人时和场时分开,不考虑人时订单 |
|||
*/ |
|||
import headerTemp from "../modules/order_detail/header_temp.vue"; |
|||
import infoTemp from "../modules/order_detail/info_temp.vue"; |
|||
import kvLine from "../../../components/kv_line.vue"; |
|||
import kvsLine from "../../../components/kvs_line.vue"; |
|||
import endBillingModal from "../modules/order_detail/end_billing_modal.vue"; |
|||
import bottomFixed from "../modules/order_detail/bottom_fixed.vue"; |
|||
import refundButton from "@/components/order_refund/permission_btn.vue"; |
|||
import orderRefundModal from '@/components/order_refund/modal.vue'; |
|||
import orderRefundInfo from '@/components/order_refund/info.vue'; |
|||
|
|||
import { showModal, routeTo } from '@/utils/util'; |
|||
import { getOrderDetail, cancelOrderServer, finishOrder, siteAndPeopleRefundServer } from "./common"; |
|||
export default { |
|||
components: { |
|||
'header-temp': headerTemp, |
|||
'info-temp': infoTemp, |
|||
'kv-line': kvLine, |
|||
'kvs-line': kvsLine, |
|||
'bottom-fixed': bottomFixed, |
|||
'end-billing-modal': endBillingModal, |
|||
'refund-button': refundButton, |
|||
'order-refund-modal': orderRefundModal, |
|||
'order-refund-info': orderRefundInfo |
|||
}, |
|||
computed: { |
|||
extension(){ |
|||
let { orderInfo } = this; |
|||
return orderInfo?.extension || {}; |
|||
} |
|||
}, |
|||
data(){ |
|||
return { |
|||
orderInfo: {}, |
|||
refundList: [] |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
this.getOrderDetail({ |
|||
brand_id: options?.brand_id || '', |
|||
order_no: options?.order_no || '' |
|||
}) |
|||
.then(res=>{ |
|||
if(res?.status_text === '计费中'&&options?.is_end === '1'){ |
|||
this.endOrder(); |
|||
} |
|||
|
|||
if(res?.status_text === '待使用'&&options?.is_end === '2'){ |
|||
this.cancelOrder(); |
|||
} |
|||
}); |
|||
}, |
|||
methods: { |
|||
refundOrder(){ |
|||
let { orderInfo, extension, refundList } = this; |
|||
this.$refs.orderRefundModal.show({ |
|||
stadium_name: orderInfo?.stadium_name ?? '', |
|||
order_no: orderInfo?.order_no ?? '', |
|||
mobile: orderInfo?.mobile ?? '', |
|||
refundable_amount: extension?.refundable_amount ?? 0, |
|||
refundable_integral: extension?.refundable_integral ?? 0, |
|||
refund_times: refundList?.length || -1, |
|||
confirm: e => { |
|||
console.log('e', e) |
|||
siteAndPeopleRefundServer({ |
|||
order_no: orderInfo?.order_no || '', |
|||
amount: e?.refund_amount || 0, |
|||
integral: e?.refund_integral || 0, |
|||
}) |
|||
.finally(()=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id || '', |
|||
order_no: orderInfo?.order_no || '' |
|||
}); |
|||
}, 1000); |
|||
}) |
|||
} |
|||
}); |
|||
}, |
|||
// 取消预约 |
|||
cancelOrder(){ |
|||
let { orderInfo } = this; |
|||
showModal({ |
|||
title: '提示', |
|||
content: '是否确认取消订单?', |
|||
showCancel: true, |
|||
success: modalRes=>{ |
|||
if(modalRes.confirm)cancelOrderServer({ |
|||
brand_id: orderInfo?.brand_id || '', |
|||
order_no: orderInfo?.order_no || '' |
|||
}) |
|||
.finally(res=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no |
|||
}); |
|||
}, 1000); |
|||
}); |
|||
} |
|||
}) |
|||
}, |
|||
// 结束计费 |
|||
endOrder(){ |
|||
let { orderInfo } = this; |
|||
this.$refs.endBillingModal.initModal({ |
|||
operator: orderInfo?.end_bill_operator_name, |
|||
duration: orderInfo?.extension?.duration, |
|||
amount: orderInfo?.amount, |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no, |
|||
success: res=>{ |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no |
|||
}); |
|||
}, 1000); |
|||
} |
|||
}); |
|||
}, |
|||
// // 完结订单弹窗 |
|||
finishOrder(){ |
|||
let { orderInfo } = this; |
|||
finishOrder({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no, |
|||
stadium_id: orderInfo?.stadium_id, |
|||
opts: { |
|||
finally: ()=> { |
|||
setTimeout(()=>{ |
|||
this.getOrderDetail({ |
|||
brand_id: orderInfo?.brand_id, |
|||
order_no: orderInfo?.order_no |
|||
}); |
|||
}, 1000); |
|||
} |
|||
} |
|||
}) |
|||
}, |
|||
toDepoistDetail(){ |
|||
let { orderInfo } = this; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_detail/deposit?order_no=${orderInfo.deposit_order_no || ''}&brand_id=${orderInfo.brand_id || ''}`, 'rT'); |
|||
}, |
|||
// 获取订单详情 |
|||
async getOrderDetail({ brand_id = '', order_no = '' }){ |
|||
let _detail = await getOrderDetail({ brand_id, order_no }); |
|||
this.orderInfo = _detail || {}; |
|||
this.getRefundData({ order_no }); |
|||
return _detail; |
|||
}, |
|||
// 获取退款信息 |
|||
async getRefundData({ order_no }){ |
|||
let _refundRes = await this.$store.dispatch('getOrderRefundList', order_no); |
|||
let _refundLs = _refundRes?.data?.data?.list || []; |
|||
this.refundList = _refundLs; |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.site-order-detail{ |
|||
padding: 24upx; |
|||
.od-status{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
@include flcw(28upx, 40upx, #9C9C9F); |
|||
&.active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
.od-check{ |
|||
margin-left: auto; |
|||
flex-shrink: 0; |
|||
@include flcw(24upx, 40upx, $mColor); |
|||
} |
|||
|
|||
.od-pay-info{ |
|||
margin-top: 20upx; |
|||
border-top: 1px solid #D8D8D8; |
|||
} |
|||
.od-total{ |
|||
padding-top: 10upx; |
|||
text-align: right; |
|||
@include flcw(28upx, 50upx, #1A1A1A, 500); |
|||
@include tHide; |
|||
.pt-name{ |
|||
color: #9A9A9D; |
|||
font-weight: 400; |
|||
} |
|||
} |
|||
.od-deposit-explain{ |
|||
margin-left: 12upx; |
|||
@include flcw(24upx, 40upx, #9C9C9F); |
|||
@include tHide; |
|||
} |
|||
} |
|||
.od-margin{ |
|||
height: 24upx; |
|||
background: transparent; |
|||
} |
|||
|
|||
.pod-btn{ |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
background: $mColor; |
|||
@include flcw(32upx, 112upx, #fff, 500); |
|||
} |
|||
</style> |
@ -0,0 +1,281 @@ |
|||
<template> |
|||
<view class="timekeeping-order-list"> |
|||
<order-list-header |
|||
ref="orderListHeader" |
|||
@change:stadium="changeStadium" |
|||
@click:time="showPeriodModal" |
|||
@click:filter="showFilterModal" |
|||
@click:search="searchOrder" |
|||
:start-time="condition.start" |
|||
:end-time="condition.end" |
|||
:success-count="countInfo.success_count" |
|||
:refund-count="countInfo.refund_count" |
|||
></order-list-header> |
|||
<view class="tol-list"> |
|||
<block v-for="(e, i) in orderList" :key="i"> |
|||
<view class="tl-item" v-if="e.order_type === 1"> |
|||
<site-list-item :order="e"></site-list-item> |
|||
</view> |
|||
<view class="tl-item" v-if="e.order_type === 2"> |
|||
<person-list-item :order="e"></person-list-item> |
|||
</view> |
|||
<view class="tl-item" v-if="e.order_type === 3"> |
|||
<deposit-list-item :order="e"></deposit-list-item> |
|||
</view> |
|||
</block> |
|||
|
|||
</view> |
|||
|
|||
<!-- 时间段选择 --> |
|||
<period-modal ref="periodModal" ></period-modal> |
|||
<!-- status窗口 --> |
|||
<filter-modal ref="filterModal"></filter-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import orderListHeader from "../../components/order_list/header.vue"; |
|||
import periodModal from "../../components/order_list/period_modal.vue"; |
|||
import filterModal from "../../components/order_list/filter_modal.vue"; |
|||
|
|||
import personListItem from "./modules/order_list/person.vue"; |
|||
import siteListItem from "./modules/order_list/site.vue"; |
|||
import depositListItem from "./modules/order_list/deposit.vue"; |
|||
|
|||
import { ORDER_API } from '../../js/api'; |
|||
import server from '../../js/server'; |
|||
import { showLoad, hideLoad, formatDate, showNone, routeTo } from '@/utils/util'; |
|||
const enumOrderType = { |
|||
site: '1', // 场时 |
|||
person: '2' // 人时 |
|||
} |
|||
export default { |
|||
components: { |
|||
'order-list-header': orderListHeader, |
|||
'period-modal': periodModal, |
|||
'filter-modal': filterModal, |
|||
|
|||
'person-list-item': personListItem, |
|||
'site-list-item': siteListItem, |
|||
'deposit-list-item': depositListItem, |
|||
}, |
|||
watch: { |
|||
condition: { |
|||
handler(nVal, oVal){ |
|||
this.orderList = []; |
|||
this.countInfo.refund_count = 0; |
|||
this.countInfo.success_count = 0; |
|||
let { brand_id, order_type } = this; |
|||
this.getOrderList({ |
|||
brand_id: brand_id || '', |
|||
order_type: order_type || '', |
|||
...nVal, |
|||
}) |
|||
}, |
|||
deep: true |
|||
} |
|||
}, |
|||
data(){ |
|||
return { |
|||
brand_id: '', |
|||
order_type: '', // 2: 人时 1: 场时 |
|||
condition: { // 查询条件 |
|||
stadium_id: '', // 场馆id |
|||
start: '', // 开始时间 |
|||
end: '', // 结束时间 |
|||
status: '', // 订单状态 |
|||
status_text: '', // 订单状态文本 |
|||
}, |
|||
page: 1, |
|||
orderList: [], |
|||
countInfo: { |
|||
// refund_count: 0, // 退款笔数 |
|||
// success_count: 0, // 成功笔数 |
|||
// total: 0, // 总笔数 |
|||
}, |
|||
} |
|||
}, |
|||
async onLoad(options){ |
|||
let _bID = options?.brand_id || ''; |
|||
let _order_type = options?.order_type || ''; |
|||
this.setTitle(_order_type); |
|||
let { start, end } = this.initDefaultDate(); |
|||
let { value } = this.initDefaultStatus(_order_type); |
|||
this.getOrderList({ |
|||
brand_id: _bID, |
|||
start: start, |
|||
end: end, |
|||
status_text: value, |
|||
order_type: _order_type |
|||
}) |
|||
this.brand_id = _bID; |
|||
this.order_type = _order_type; |
|||
let _list = await this.$refs.orderListHeader.initStadiumSelect(_bID); |
|||
|
|||
}, |
|||
onReachBottom(){ |
|||
let { brand_id, order_type, condition, page } = this; |
|||
this.getOrderList({ |
|||
brand_id: brand_id || '', |
|||
order_type: order_type || '', |
|||
page: page + 1, |
|||
...condition, |
|||
}) |
|||
}, |
|||
methods: { |
|||
// 搜索订单 |
|||
searchOrder(){ |
|||
let { brand_id, order_type } = this; |
|||
let _qryStr = `brand_id=${brand_id || ''}&order_type=${order_type || ''}`; |
|||
routeTo(`/subpackage/order/pages/timekeeping/order_search?${_qryStr}`, 'nT'); |
|||
}, |
|||
setTitle(type){ |
|||
let _title = ''; |
|||
switch(type){ |
|||
case enumOrderType.site: |
|||
_title = '场地计时订单'; |
|||
break; |
|||
case enumOrderType.person: |
|||
_title = '散客计时订单'; |
|||
break; |
|||
} |
|||
uni.setNavigationBarTitle({ |
|||
title: _title |
|||
}) |
|||
}, |
|||
// 打开筛选窗口 |
|||
showFilterModal(){ |
|||
this.$refs.filterModal.init({ |
|||
title: '订单状态', |
|||
list: this.getFilterList(this.order_type), |
|||
curValue: this.condition.status_text, |
|||
success: item =>{ |
|||
console.log(item); |
|||
this.condition.status_text = item.value; |
|||
} |
|||
}); |
|||
}, |
|||
// 初始化默认状态 |
|||
initDefaultStatus(order_type){ |
|||
let _ls = this.getFilterList(order_type); |
|||
let _defaultItem = _ls?.[0] || {} |
|||
this.condition.status_text = _defaultItem?.value; |
|||
return _defaultItem; |
|||
}, |
|||
// 获取筛选列表 |
|||
getFilterList(order_type){ |
|||
let _obj = { |
|||
[enumOrderType.site]: [ |
|||
{ label: '全部', value: '' }, |
|||
{ label: '待使用', value: '待使用' }, |
|||
{ label: '计费中', value: '计费中' }, |
|||
{ label: '待支付', value: '待支付' }, |
|||
{ label: '已完成', value: '已完成' }, |
|||
{ label: '已退款', value: '已退款' }, |
|||
{ label: '押金', value: '押金' }, |
|||
], |
|||
[enumOrderType.person]: [ |
|||
{ label: '全部', value: '' }, |
|||
{ label: '计费中', value: '计费中' }, |
|||
{ label: '待支付', value: '待支付' }, |
|||
{ label: '已完成', value: '已完成' }, |
|||
{ label: '已退款', value: '已退款' }, |
|||
] |
|||
} |
|||
return _obj?.[order_type] ?? {}; |
|||
}, |
|||
// 店铺选择 |
|||
changeStadium(e){ |
|||
this.condition.stadium_id = e.id; |
|||
}, |
|||
// 显示时间段选择 |
|||
showPeriodModal(){ |
|||
let { start, end } = this.condition; |
|||
this.$refs.periodModal.init({ |
|||
start: start, |
|||
end: end, |
|||
success: res=>{ |
|||
this.condition.start = res.start; |
|||
this.condition.end = res.end; |
|||
} |
|||
}); |
|||
}, |
|||
// 初始化默认时间 |
|||
initDefaultDate(){ |
|||
let _date = new Date(); |
|||
let _sevenTimeStemp = 7*24*60*60*1000; |
|||
let _beforeSeven = _date.getTime() - _sevenTimeStemp; |
|||
let _obj = { |
|||
start: formatDate({ date: _beforeSeven }), |
|||
end: formatDate({}) |
|||
} |
|||
this.condition.start = _obj.start; |
|||
this.condition.end = _obj.end; |
|||
return _obj; |
|||
}, |
|||
|
|||
/** |
|||
* @param {String} brand_id 品牌id |
|||
* @param {String} stadium_id 场馆id |
|||
* @param {String} status 支付状态:未支付/已支付/已退款/反馈[0/1/2/3] |
|||
* @param {String} start 开始时间 |
|||
* @param {String} end 结束时间 |
|||
* @param {String} order_type 订单类型:场时/人时[1/2] |
|||
* @param {String} status_text 已关闭/计费中/待支付/待使用/使用中/已失效/已完成/已抵扣/已退款/已取消预约 |
|||
* |
|||
* */ |
|||
getOrderList({ |
|||
brand_id = '', stadium_id = '', |
|||
status = '', start = '', end = '', |
|||
order_type = '', page = 1, page_size = 20, |
|||
status_text = '' |
|||
}){ |
|||
showLoad(); |
|||
server.get({ |
|||
url: ORDER_API.billingOrderList, |
|||
data: { |
|||
brand_id, stadium_id, status, |
|||
start: start + ' 00:00:00', end: end + ' 23:59:59', |
|||
order_type: this.getReqOrderType(order_type), page, page_size, |
|||
status_text: status_text === '押金' ? '' : status_text |
|||
}, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
let { list, ...info } = res; |
|||
let _list = list || []; |
|||
if(page == 1){ |
|||
this.countInfo = info; |
|||
this.orderList = _list; |
|||
return |
|||
} |
|||
if(_list?.length <= 0)return showNone('没有更多数据了!'); |
|||
this.orderList = [...this.orderList, ..._list]; |
|||
this.page = page; |
|||
|
|||
}) |
|||
}, |
|||
// 获取请求订单类型 |
|||
getReqOrderType(type){ |
|||
let { condition } = this; |
|||
if(type === enumOrderType.site&&condition.status_text === '押金')return '3'; // 场时需要同时加载押金订单 |
|||
if(type === enumOrderType.site)return '1,3'; // 场时需要同时加载押金订单 |
|||
return type; |
|||
} |
|||
} |
|||
} |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.timekeeping-order-list{ |
|||
@include isPd(20upx); |
|||
} |
|||
.tol-list{ |
|||
padding: 0 24upx; |
|||
.tl-item + .tl-item{ |
|||
margin-top: 24upx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,132 @@ |
|||
<template> |
|||
<view class="order-search"> |
|||
<search-bar |
|||
@confirm:search="searchOrder" |
|||
></search-bar> |
|||
<view class="os-list"> |
|||
<block v-for="(e, i) in orderList" :key="i"> |
|||
<view class="tl-item" v-if="e.order_type === 1"> |
|||
<site-list-item :order="e"></site-list-item> |
|||
</view> |
|||
<view class="tl-item" v-if="e.order_type === 2"> |
|||
<person-list-item :order="e"></person-list-item> |
|||
</view> |
|||
<view class="tl-item" v-if="e.order_type === 3"> |
|||
<deposit-list-item :order="e"></deposit-list-item> |
|||
</view> |
|||
</block> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import search_bar from './modules/order_search/search_bar.vue'; |
|||
|
|||
import personListItem from "./modules/order_list/person.vue"; |
|||
import siteListItem from "./modules/order_list/site.vue"; |
|||
import depositListItem from "./modules/order_list/deposit.vue"; |
|||
|
|||
import { ORDER_API } from '../../js/api'; |
|||
import server from '../../js/server'; |
|||
import { showLoad, hideLoad, showNone } from '@/utils/util'; |
|||
const enumOrderType = { |
|||
site: '1', // 场时 |
|||
person: '2' // 人时 |
|||
} |
|||
export default { |
|||
components: { |
|||
'search-bar': search_bar, |
|||
|
|||
'person-list-item': personListItem, |
|||
'site-list-item': siteListItem, |
|||
'deposit-list-item': depositListItem, |
|||
}, |
|||
data() { |
|||
return { |
|||
orderList: [], |
|||
page: 1, |
|||
optionsQuery: { |
|||
brand_id: '', |
|||
order_type: '', |
|||
}, |
|||
searchTxt: '' |
|||
} |
|||
}, |
|||
onLoad(options) { |
|||
this.optionsQuery = options; |
|||
}, |
|||
onReachBottom(){ |
|||
let { page, optionsQuery, searchTxt } = this; |
|||
this.getOrderList({ |
|||
brand_id: optionsQuery?.brand_id || '', |
|||
order_type: optionsQuery?.order_type || '', |
|||
key: searchTxt || '', |
|||
page: ++page |
|||
}) |
|||
}, |
|||
methods: { |
|||
searchOrder(value){ |
|||
let { optionsQuery } = this; |
|||
this.searchTxt = value; |
|||
this.getOrderList({ |
|||
brand_id: optionsQuery.brand_id, |
|||
order_type: optionsQuery.order_type, |
|||
key: value |
|||
}) |
|||
}, |
|||
/** |
|||
* @param {String} brand_id 品牌id |
|||
* @param {String} stadium_id 场馆id |
|||
* @param {String} status 支付状态:未支付/已支付/已退款/反馈[0/1/2/3] |
|||
* @param {String} start 开始时间 |
|||
* @param {String} end 结束时间 |
|||
* @param {String} order_type 订单类型:场时/人时[1/2] |
|||
* @param {String} status_text 已关闭/计费中/待支付/待使用/使用中/已失效/已完成/已抵扣/已退款/已取消预约 |
|||
* @param {String} key 搜索关键字 |
|||
* |
|||
* */ |
|||
getOrderList({ |
|||
brand_id = '', stadium_id = '', |
|||
status = '', start = '', end = '', |
|||
order_type = '', page = 1, page_size = 20, |
|||
status_text = '', key = '' |
|||
}){ |
|||
showLoad(); |
|||
server.get({ |
|||
url: ORDER_API.billingOrderList, |
|||
data: { |
|||
brand_id, stadium_id, status, |
|||
start, end, order_type: this.getReqOrderType(order_type), page, page_size, |
|||
status_text, key |
|||
}, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
hideLoad(); |
|||
let { list, ...info } = res; |
|||
let _list = list || []; |
|||
if(page == 1)return this.orderList = _list; |
|||
if(_list?.length <= 0)return showNone('没有更多数据了!'); |
|||
this.page = page; |
|||
this.orderList = [...this.orderList, ..._list]; |
|||
|
|||
}) |
|||
}, |
|||
// 获取请求订单类型 |
|||
getReqOrderType(type){ |
|||
if(type === enumOrderType.site)return '1,3'; // 场时需要同时加载押金订单 |
|||
return type; |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.os-list{ |
|||
padding: 24upx; |
|||
@include isPd(24upx); |
|||
.tl-item + .tl-item{ |
|||
margin-top: 24upx; |
|||
} |
|||
} |
|||
</style> |
@ -1,379 +0,0 @@ |
|||
<template> |
|||
<view class="timing-details"> |
|||
<view class="td-head"> |
|||
<view class="th-store"> |
|||
<image :src="orderInfo.stadium_logo || ''"></image> |
|||
<view>{{orderInfo.stadium_name || '-'}}</view> |
|||
</view> |
|||
<view class="th-line"> |
|||
<view>订单编号:<text>{{orderInfo.order_no || '-'}}</text></view> |
|||
<view><text :class="[orderInfo.pay_status == 0?'tl-active':'']">{{zh_order_status(orderInfo.pay_status)}}</text></view> |
|||
</view> |
|||
<view class="th-line"> |
|||
<view>创建时间:<text>{{orderInfo.model.created_at || '-'}}</text></view> |
|||
</view> |
|||
<view class="th-line"> |
|||
<view>用户昵称:<text>{{orderInfo.nickname || '-'}}</text></view> |
|||
</view> |
|||
</view> |
|||
<view class="td-box"> |
|||
<view class="tb-title">计时信息</view> |
|||
<view class="tb-line"> |
|||
<!-- 项目 场时有 人时没有 order_type: 1场时 2人时 --> |
|||
<view v-if="orderInfo.order_type==1">项目:<text>{{orderInfo.project_name || '-'}}({{orderInfo.venue_name || '-'}})</text></view> |
|||
<view>进场时间:<text>{{orderInfo.start_time || '-'}}</text></view> |
|||
<!-- 离场时间 已完成显示 --> |
|||
<view v-if="orderInfo.pay_status != 0">离场时间:<text>{{orderInfo.end_time || '-'}}</text></view> |
|||
<view>时长合计:<text>{{orderInfo.extension.duration || '-'}}</text></view> |
|||
</view> |
|||
<view class="tb-section" v-if="!(orderInfo.pay_status== 0&&orderInfo.early_end_timing==false)"> |
|||
<view class="ts-line"> |
|||
<view>金额小计</view> |
|||
<view>¥{{orderInfo.amount || 0}}</view> |
|||
</view> |
|||
<view class="ts-line"> |
|||
<view>积分抵扣</view> |
|||
<view>-¥{{orderInfo.deduction_amount ||0}}</view> |
|||
</view> |
|||
<view class="ts-line"> |
|||
<view>折扣金额</view> |
|||
<view>-¥{{orderInfo.discount_amount||0}}</view> |
|||
</view> |
|||
<view class="ts-line"> |
|||
<view>优惠券优惠</view> |
|||
<view>-¥{{orderInfo.coupons_amount || 0}}</view> |
|||
</view> |
|||
<view class="ts-total"> |
|||
<view>合计支付:<text>¥</text><text>{{orderInfo.pay_amount ||0}}</text></view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="td-box" v-if="orderInfo.pay_status != 0"> |
|||
<view class="tb-title">支付信息</view> |
|||
<view class="tb-line"> |
|||
<view>支付方式:<text>{{zh_pay_type(orderInfo.pay_type)}}</text></view> |
|||
<view>支付时间:<text>{{orderInfo.pay_time || '-'}}</text></view> |
|||
<view v-if="orderInfo.pay_type==0">微信交易号:<text>{{orderInfo.trade_no || ''}}</text></view> |
|||
<view v-if="orderInfo.pay_type==3">操作人:<text>{{orderInfo.end_bill_operator_name || ''}}</text></view> |
|||
</view> |
|||
</view> |
|||
|
|||
|
|||
<!-- 退款列表 --> |
|||
<view v-for="(e, i) in refundList" :key="i" style="padding: 24rpx 24rpx 0;"> |
|||
<order-refund-info |
|||
:refund_price="e.amount || 0" |
|||
:refund_no="e.refund_no || '-'" |
|||
:refund_time="e.refund_time || '-'" |
|||
:refund_reason="e.reason || '-'" |
|||
:nameKey="i + 1" |
|||
></order-refund-info> |
|||
</view> |
|||
|
|||
<view class="td-btn" @click="isEndBill = true" v-if="orderInfo.pay_status == 0&&orderInfo.early_end_timing==false">结束计费</view> |
|||
<view class="td-btn" @click="completeBtn" v-if="orderInfo.pay_status == 0&&orderInfo.early_end_timing==true">完结订单</view> |
|||
|
|||
<!-- 退款按钮拦 --> |
|||
<order-refund-fixed |
|||
:pay_amount="orderInfo.pay_amount || 0" |
|||
:refund_amount="orderInfo.refund_amount || 0" |
|||
:refund_times="(refundList&&refundList.length) || 0" |
|||
@click:button="refunndBtn" |
|||
></order-refund-fixed> |
|||
|
|||
<!-- 结束计费弹框 --> |
|||
<end-billing-modal |
|||
v-if="isEndBill==true" |
|||
@close="isEndBill=false" |
|||
@timeEndBtn="timeEndBtn" |
|||
:orderInfo="orderInfo" |
|||
></end-billing-modal> |
|||
<!-- 退款弹窗 --> |
|||
<order-refund-modal |
|||
ref="orderRefundModal" |
|||
></order-refund-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '@/utils/util'; |
|||
import { ORDER_API } from '../../js/api'; |
|||
import server from '../../js/server'; |
|||
import { mapState } from 'vuex'; |
|||
import end_billing_modal from '@/components/end_billing_modal/end_billing_modal.vue'; |
|||
import orderRefundFixed from '@/components/order_refund/fixed.vue' |
|||
import orderRefundModal from '@/components/order_refund/modal.vue'; |
|||
import orderRefundInfo from '@/components/order_refund/info.vue'; |
|||
export default { |
|||
components: { |
|||
'end-billing-modal': end_billing_modal, |
|||
'order-refund-fixed': orderRefundFixed, |
|||
'order-refund-modal': orderRefundModal, |
|||
'order-refund-info': orderRefundInfo |
|||
}, |
|||
computed: { |
|||
...mapState(['brandInfo']), |
|||
zh_order_status(){ |
|||
// 订单状态 0计费中1已完成 |
|||
let { orderInfo } = this |
|||
return status =>{ |
|||
const _obj = { |
|||
'0': orderInfo.early_end_timing==true?'待支付':'计费中', |
|||
'1': '已完成', |
|||
'4': '已退款', |
|||
} |
|||
return _obj[`${status}`] || '-' |
|||
} |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
isEndBill: false, |
|||
orderInfo: {}, |
|||
refundList: [], // 退款列表 |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
this.getOrderInfo({ |
|||
order_no: options?.order_no || '', |
|||
stadium_id: options?.stadium_id || '' |
|||
}) |
|||
this.getRefundTimes(options?.order_no || ''); |
|||
}, |
|||
methods: { |
|||
refunndBtn(){ |
|||
let { orderInfo, refundList } = this; |
|||
this.$refs.orderRefundModal.show({ |
|||
stadium_name: orderInfo?.stadium_name ?? '', |
|||
order_no: orderInfo?.order_no ?? '', |
|||
mobile: orderInfo?.mobile ?? '', |
|||
refundable_amount: orderInfo?.extension?.refundable_amount ?? 0, |
|||
refundable_integral: orderInfo?.extension?.refundable_integral ?? 0, |
|||
refund_times: refundList?.length || -1, |
|||
confirm: e => { |
|||
this.orderRefund({ |
|||
order_no: orderInfo?.order_no || '', |
|||
amount: e.refund_amount || 0, |
|||
integral: e.refund_integral || 0, |
|||
stadium_id: orderInfo?.stadium_id || '' |
|||
}) |
|||
} |
|||
}); |
|||
}, |
|||
orderRefund({ order_no = '', amount = 0, integral = 0, stadium_id = ''}){ |
|||
util.showLoad(); |
|||
server.get({ |
|||
url: ORDER_API.orderRefund, |
|||
data: { order_no, amount, integral }, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
util.showNone(res.data.message || '操作成功!'); |
|||
}else{ |
|||
util.showNone(res.data.message || '操作失败!'); |
|||
} |
|||
}) |
|||
.catch(util.hideLoad) |
|||
.finally(_=>setTimeout(_=>{ |
|||
this.getOrderInfo({ order_no, stadium_id }); |
|||
this.getRefundTimes(order_no); |
|||
}, 1200)); |
|||
}, |
|||
async getRefundTimes(order_no){ |
|||
try{ |
|||
let _refundRes = await this.$store.dispatch('getOrderRefundList', order_no); |
|||
let _refundLs = _refundRes?.data?.data?.list || []; |
|||
this.refundList = _refundLs; |
|||
}catch(err){ |
|||
console.warn('getRefundTimes err', err); |
|||
} |
|||
}, |
|||
getOrderInfo({ order_no, stadium_id }){ |
|||
util.showLoad(); |
|||
server.get({ |
|||
url: ORDER_API.timeOrderDetail, |
|||
data: { order_no, stadium_id }, |
|||
failMsg: '加载失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad() |
|||
this.orderInfo = res || {} |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
zh_pay_type: util.order_pay_type_txt, |
|||
completeBtn(){ |
|||
this.$emit('completeBtn'); |
|||
}, |
|||
|
|||
timeEndBtn(){ |
|||
let { orderInfo } = this; |
|||
this.getOrderInfo({ |
|||
order_no: orderInfo?.order_no || '', |
|||
stadium_id: orderInfo?.stadium_id || '' |
|||
}) |
|||
}, |
|||
// 计时订单-完结订单 |
|||
completeBtn(){ |
|||
let { orderInfo } = this |
|||
util.showModal({ |
|||
title: '提示', |
|||
content: '是否确认完结订单?', |
|||
showCancel: true, |
|||
success: modalRes=>{ |
|||
if(modalRes.confirm)this.timeOrderComplete({ |
|||
brand_id: orderInfo?.brand_id || '', |
|||
order_no: orderInfo?.order_no || '', |
|||
stadium_id: orderInfo?.stadium_id || '' |
|||
}) |
|||
} |
|||
}) |
|||
}, |
|||
//计时订单完结 请求 |
|||
timeOrderComplete({ brand_id, order_no, stadium_id }){ |
|||
util.showLoad(); |
|||
server.get({ |
|||
url: ORDER_API.timeOrderComplete, //计时订单完结 |
|||
data: { brand_id, order_no }, |
|||
failMsg: '请求失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
util.showNone('操作成功!'); |
|||
|
|||
setTimeout(_=>{ |
|||
this.getOrderInfo({ order_no, stadium_id }); |
|||
util.previousPageFunction({ |
|||
fnName: 'refreshList', |
|||
query: { isLoad: false}, |
|||
}); |
|||
}, 1200) |
|||
}) |
|||
.catch(util.hideLoad) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" > |
|||
.timing-details{ |
|||
margin-bottom: 24rpx; |
|||
.td-head{ |
|||
margin: 24rpx 24rpx 0rpx; |
|||
padding: 30rpx; |
|||
background-color: #FFF; |
|||
border-radius: 10rpx 10rpx 0px 0px; |
|||
.th-store{ |
|||
padding-bottom: 26rpx; |
|||
margin-bottom: 18rpx; |
|||
border-bottom: 2rpx solid #D8D8D8; |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
>image{ |
|||
flex-shrink: 0; |
|||
width: 40rpx; |
|||
height: 40rpx; |
|||
} |
|||
>view{ |
|||
flex-grow: 1; |
|||
margin-left: 14rpx; |
|||
color: #333333; |
|||
font-size: 28rpx; |
|||
} |
|||
} |
|||
.th-line{ |
|||
margin-top: 8rpx; |
|||
@include ctf(space-between); |
|||
>view{ |
|||
line-height: 40rpx; |
|||
font-size: 28rpx; |
|||
&:first-child{ |
|||
color: #9A9A9D; |
|||
>text{ |
|||
color: #333333; |
|||
} |
|||
} |
|||
&:nth-child(2){ |
|||
>text{ |
|||
color: #9A9A9D; |
|||
} |
|||
.tl-active{ |
|||
color: $mColor; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.td-box{ |
|||
margin: 24rpx 24rpx 0rpx; |
|||
padding: 30rpx; |
|||
background-color: #FFF; |
|||
border-radius: 10rpx; |
|||
.tb-title{ |
|||
color: #9A9A9D; |
|||
font-size: 28rpx; |
|||
margin-bottom: 20rpx; |
|||
} |
|||
.tb-line{ |
|||
>view{ |
|||
line-height: 52rpx; |
|||
font-size: 28rpx; |
|||
color: #9A9A9D; |
|||
>text{ |
|||
color: #333333; |
|||
} |
|||
} |
|||
|
|||
} |
|||
.tb-section{ |
|||
margin-top: 30rpx; |
|||
border-top: 2rpx solid #D8D8D8; |
|||
.ts-line{ |
|||
margin-top: 26rpx; |
|||
@include ctf(space-between); |
|||
>view{ |
|||
color: #333333; |
|||
&:first-child{ |
|||
font-size: 28rpx; |
|||
} |
|||
&:nth-child(2){ |
|||
font-size: 24rpx; |
|||
margin-right: 8rpx; |
|||
} |
|||
} |
|||
} |
|||
.ts-total{ |
|||
margin-top: 22rpx; |
|||
@include ctf(flex-end); |
|||
>view{ |
|||
color: #333333; |
|||
font-size: 28rpx; |
|||
>text{ |
|||
color: #FF873D; |
|||
&:first-child{ |
|||
font-size: 28rpx; |
|||
} |
|||
&:nth-child(2){ |
|||
font-size: 36rpx; |
|||
margin-right: 8rpx; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.td-btn{ |
|||
height: 112rpx; |
|||
margin: 80rpx 24rpx 10upx; |
|||
border-radius: 10rpx; |
|||
background-color: $mColor; |
|||
color: #FFF; |
|||
font-size: 32rpx; |
|||
line-height: 112rpx; |
|||
text-align: center; |
|||
} |
|||
|
|||
} |
|||
</style> |
After Width: 40 | Height: 40 | Size: 127 B |
After Width: 60 | Height: 60 | Size: 920 B |
Before Width: 120 | Height: 120 | Size: 1.2 KiB After Width: 120 | Height: 120 | Size: 1.2 KiB |
After Width: 32 | Height: 32 | Size: 369 B |
After Width: 40 | Height: 40 | Size: 386 B |