-
36src/pages.json
-
175src/pages/write_off/douyin/poi_list.vue
-
237src/pages/write_off/mall/list/list.vue
-
131src/pages/write_off/menu/menu.vue
-
70src/pages/write_off/null/null.vue
-
496src/pages/write_off/number_of_people/number_of_people.vue
-
363src/pages/write_off/operate/operate.vue
-
339src/pages/write_off/search_result/search_result.vue
-
BINsrc/static/images/code_null.png
-
BINsrc/static/images/countdown_bg.png
-
BINsrc/static/images/order_null.png
-
BINsrc/static/images/scan_null.png
-
BINsrc/static/images/write_off/mall.png
-
BINsrc/static/images/write_off/order.png
-
BINsrc/static/images/write_off/people.png
-
BINsrc/static/images/write_off/site.png
-
6src/subpackage/verification/pages/index.vue
-
7src/subpackage/verification/pages/site_people/modules/not_leave_modal.vue
@ -1,175 +0,0 @@ |
|||
<template> |
|||
<view class="dy-poi-ls"> |
|||
<view class="dpl-header"> |
|||
<stadium-picker |
|||
:stadium-list="stadiumList" |
|||
@change:stadium="stadiumChange" |
|||
></stadium-picker> |
|||
<!-- <period-picker></period-picker> --> |
|||
<view class="dh-number">核销数量:{{ totalNum || 0 }}</view> |
|||
</view> |
|||
<view class="dpl-list"> |
|||
<view class="dl-item" v-for="(e, i) in writeOffList" :key="i"> |
|||
<list-item |
|||
:order-no="e.order_no" |
|||
:user-phone="e.user_phone" |
|||
:verify-code="e.verify_code" |
|||
:verify-method="e.verify_method" |
|||
:verify-time="e.verify_time" |
|||
></list-item> |
|||
</view> |
|||
</view> |
|||
|
|||
<view class="r-bottom-btn"><view @click="toOperate">核销团购券</view></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import periodPicker from "../all_components/period_picker.vue"; |
|||
import stadiumPicker from "../all_components/stadium_picker.vue"; |
|||
import listItem from "../all_components/list_item.vue"; |
|||
import { API } from '../../../js/api'; |
|||
import { servers } from '../../../js/server'; |
|||
import util from '../../../utils/util'; |
|||
import { mapState } from 'vuex'; |
|||
import { WRITE_OFF_STORE_NAME } from '../../../js/once_name'; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
}, |
|||
components: { |
|||
periodPicker, |
|||
stadiumPicker, |
|||
listItem |
|||
}, |
|||
data() { |
|||
return { |
|||
totalNum: 0, |
|||
writeOffList: [], |
|||
stadiumList: [], |
|||
curStadium: {}, |
|||
page: 1, |
|||
} |
|||
}, |
|||
async onLoad() { |
|||
let _brand_id = this.brandInfo?.brand?.id || 63; |
|||
let _list = await this.getStoreList({ brand_id: _brand_id }); |
|||
this.stadiumList = _list || []; |
|||
this.getList({ brand_id: _brand_id }); |
|||
|
|||
}, |
|||
onReachBottom(){ |
|||
let { page, curStadium } = this; |
|||
this.getList({ |
|||
brand_id: curStadium?.brand_id, |
|||
stadium_id: curStadium?.id, |
|||
page: page + 1, |
|||
}) |
|||
}, |
|||
methods: { |
|||
toOperate(){ |
|||
let { stadiumList, curStadium } = this; |
|||
util.$_emit(WRITE_OFF_STORE_NAME, { |
|||
stadiumList, |
|||
curStadium, |
|||
}) |
|||
util.routeTo(`/pages/write_off/operate/operate?type=dypoi`, 'rT'); |
|||
}, |
|||
stadiumChange(stadium){ |
|||
this.curStadium = stadium; |
|||
this.page = 1; |
|||
this.totalNum = 0; |
|||
this.writeOffList = []; |
|||
this.getList({ |
|||
brand_id: stadium?.brand_id, |
|||
stadium_id: stadium?.id, |
|||
}) |
|||
}, |
|||
getList({ brand_id, stadium_id = '', date = '', page = 1, page_size = 20, order_status = 'used' }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.dyPoiOrderList, |
|||
data: { brand_id, stadium_id, date, page, page_size, order_status }, |
|||
failMsg: '加载失败!', |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
this.totalNum = res.total || 0; |
|||
let _list = (res.list || []).map(e=>this.formating(e)); |
|||
if(page == 1)return this.writeOffList = _list; |
|||
if(!_list.length)return util.showNone('没有更多!'); |
|||
this.page = page; |
|||
this.writeOffList = [...this.writeOffList, ..._list]; |
|||
}) |
|||
}, |
|||
formating(data){ |
|||
let _code = data?.order_codes?.find(e=>e?.code_status == 'used'); |
|||
return { |
|||
order_no: data?.order_no || '', |
|||
user_phone: data?.mobile || '', |
|||
verify_code: _code?.code || '', |
|||
verify_method: _code?.verification_method || '', |
|||
verify_time: _code?.verification_time || '', |
|||
} |
|||
}, |
|||
getStoreList({ |
|||
page=1, |
|||
page_size=9999, |
|||
brand_id='', |
|||
}){ |
|||
return servers.get({ |
|||
url: API.stadiumList, |
|||
data: { |
|||
page, |
|||
page_size, |
|||
brand_id, |
|||
}, |
|||
failMsg: '获取列表失败!' |
|||
}) |
|||
.then(res=>res.list || []) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.dy-poi-ls{ |
|||
@include isPd(150upx); |
|||
} |
|||
.dpl-header{ |
|||
position: sticky; |
|||
padding-bottom: 24upx; |
|||
background: #fff; |
|||
.dh-number{ |
|||
padding: 0 24upx; |
|||
text-align: right; |
|||
@include flcw(32upx, 44upx); |
|||
@include tHide; |
|||
} |
|||
} |
|||
.dpl-list{ |
|||
padding: 24upx; |
|||
.dl-item+ .dl-item{ |
|||
margin-top: 24upx; |
|||
} |
|||
} |
|||
.r-bottom-btn{ |
|||
position: fixed; |
|||
left: 0; |
|||
bottom: 0; |
|||
width: 100%; |
|||
padding: 10upx 24upx; |
|||
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
background-color: #f2f2f7; |
|||
>view{ |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
color: #fff; |
|||
background-color: $mColor; |
|||
} |
|||
} |
|||
</style> |
@ -1,237 +0,0 @@ |
|||
<template> |
|||
<view class="mall-order-ls"> |
|||
<view class="mol-date"> |
|||
<view class="md-txt">核销日期</view> |
|||
<view class="md-picker"> |
|||
<picker mode="date" @change="stChange"> |
|||
<view> |
|||
<input :value="startTime" disabled placeholder="请选择时间" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="md-txt">至</view> |
|||
<view class="md-picker"> |
|||
<picker mode="date" @change="edChange"> |
|||
<view> |
|||
<input :value="endTime" disabled placeholder="请选择时间" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
</view> |
|||
<view class="mol-list"> |
|||
<view class="ml-item" v-for="(e, i) in writeOffList" :key="i"> |
|||
<view class="mi-order-no"> |
|||
<view class="mon-num">订单编号:{{ e.product_order_no || '-' }}</view> |
|||
<view class="mon-btn" @click="copyBtn(e.product_order_no || '-')">复制</view> |
|||
</view> |
|||
<view class="mi-info"> |
|||
<view class="mi-line">取货码:{{ e.product_order_no || '-' }}</view> |
|||
<view class="mi-line">取货人:{{ e.product_order_self_pickup_info.name || '-' }} {{ e.product_order_self_pickup_info.phone || '-' }}</view> |
|||
<view class="mi-line">商品:{{ e.product_order_goods.join(';') }}</view> |
|||
<view class="mi-line">核验人:{{ e.optuname }}</view> |
|||
<view class="mi-line">取货时间:{{ e.created_at || '-' }}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<view class="mol-fixed"> |
|||
<view @click="toOperate">核销订单</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { API } from '../../../../js/api'; |
|||
import { servers } from '../../../../js/server'; |
|||
import util from '../../../../utils/util'; |
|||
import { mapState } from 'vuex'; |
|||
import { WRITE_OFF_STORE_NAME } from '../../../../js/once_name'; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
|
|||
}, |
|||
data(){ |
|||
return { |
|||
writeOffList: [], |
|||
page: 1, |
|||
startTime: '', |
|||
endTime: '', |
|||
|
|||
} |
|||
}, |
|||
onReachBottom(){ |
|||
let { brandInfo, startTime, endTime, page } = this; |
|||
this.getList({ |
|||
brand_id: brandInfo.brand.id, |
|||
stime: startTime || '', |
|||
etime: endTime || '', |
|||
page: ++page |
|||
}) |
|||
}, |
|||
onLoad(){ |
|||
// 默认显示1个月内的日期 |
|||
let _startDate = util.formatDate({ |
|||
date: new Date().getTime() - 30*24*60*60*1000 |
|||
}).substr(0, 10); |
|||
let _endDate = util.formatDate({ }).substr(0, 10); |
|||
this.startTime = _startDate; |
|||
this.endTime = _endDate; |
|||
// 默认显示1个月内的日期 |
|||
|
|||
this.$nextTick(_=> this.refreshPage()); |
|||
}, |
|||
methods: { |
|||
refreshPage(){ |
|||
let { brandInfo, startTime, endTime } = this; |
|||
this.page = 1; |
|||
this.writeOffList = []; |
|||
this.$nextTick(_=>{ |
|||
this.getList({ |
|||
brand_id: brandInfo.brand.id, |
|||
stime: startTime || '', |
|||
etime: endTime || '', |
|||
}) |
|||
}) |
|||
}, |
|||
copyBtn(data){ |
|||
uni.setClipboardData({ data }) |
|||
}, |
|||
stChange(e){ |
|||
console.warn(e) |
|||
this.startTime = e.detail.value; |
|||
this.$nextTick(_=>this.refreshPage()); |
|||
}, |
|||
edChange(e){ |
|||
this.endTime = e.detail.value; |
|||
this.$nextTick(_=>this.refreshPage()); |
|||
}, |
|||
toOperate(){ |
|||
util.$_emit(WRITE_OFF_STORE_NAME, null); |
|||
util.routeTo(`/pages/write_off/operate/operate?type=mall`, 'nT'); |
|||
}, |
|||
getList({ brand_id, page = 1, page_size = 15, stime = '', etime = '' }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.shop2WriteoffList, |
|||
data: { brand_id, page, page_size, stime, etime }, |
|||
failMsg: '加载失败!', |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
this.totalNum = res.total || 0; |
|||
let _list = res.list || []; |
|||
if(page == 1)return this.writeOffList = _list; |
|||
if(!_list.length)return util.showNone('没有更多!'); |
|||
this.page = page; |
|||
this.writeOffList = [...this.writeOffList, ..._list]; |
|||
|
|||
}) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.mall-order-ls{ |
|||
padding-bottom: 122upx; |
|||
padding-bottom: calc( 122upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 122upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
} |
|||
.mol-date{ |
|||
padding: 0 28upx; |
|||
height: 148upx; |
|||
background-color: #fff; |
|||
@include centerFlex(flex-start); |
|||
.md-txt{ |
|||
font-size: 32upx; |
|||
line-height: 44upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.md-picker{ |
|||
margin: 0 20upx; |
|||
width: 226upx; |
|||
border: 2upx solid #D8D8D8; |
|||
border-radius: 10upx; |
|||
overflow: hidden; |
|||
view{ |
|||
padding: 0 10upx; |
|||
height: 88upx; |
|||
background-color: #f2f2f7; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
} |
|||
>image{ |
|||
margin-left: 10upx; |
|||
flex-shrink: 0; |
|||
width: 22upx; |
|||
height: 22upx; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.mol-list{ |
|||
padding: 24upx; |
|||
.ml-item{ |
|||
margin-bottom: 24upx; |
|||
padding: 0 24upx; |
|||
background-color: #fff; |
|||
.mi-order-no{ |
|||
padding: 30upx 4upx; |
|||
border-bottom: 2upx solid #f2f2f7; |
|||
@include centerFlex(space-between); |
|||
.mon-num{ |
|||
font-size: 28upx; |
|||
font-weight: 500; |
|||
line-height: 40upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.mon-btn{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: $themeColor; |
|||
|
|||
} |
|||
} |
|||
.mi-info{ |
|||
padding: 30upx 4upx; |
|||
.mi-line{ |
|||
font-size: 28upx; |
|||
line-height: 52upx; |
|||
color: #9C9C9F; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.mol-fixed{ |
|||
position: fixed; |
|||
left: 0; |
|||
bottom: 0; |
|||
width: 100%; |
|||
background-color: #fff; |
|||
padding: 10upx 40upx; |
|||
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
>view{ |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
border-radius: 10upx; |
|||
} |
|||
} |
|||
</style> |
@ -1,131 +0,0 @@ |
|||
<template> |
|||
<view class="write-off-menu"> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">场地订单核销</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toOperate('site')"> |
|||
<image mode="aspectFit" src="/static/images/write_off/site.png"></image> |
|||
<view>场地订单核销</view> |
|||
</view> |
|||
<view class="wl-item" @click="toSiteList"> |
|||
<image mode="aspectFit" src="/static/images/write_off/order.png"></image> |
|||
<view>场地订单核销记录</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">商城订单核销</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toOperate('mall')"> |
|||
<image mode="aspectFit" src="/static/images/write_off/mall.png"></image> |
|||
<view>商城订单核销</view> |
|||
</view> |
|||
<view class="wl-item" @click="toMallLs"> |
|||
<image mode="aspectFit" src="/static/images/write_off/order.png"></image> |
|||
<view>商城订单核销记录</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">抖音团购核销</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toOperate('dypoi')"> |
|||
<image mode="aspectFit" src="/static/images/write_off/site.png"></image> |
|||
<view>抖音团购核销</view> |
|||
</view> |
|||
<view class="wl-item" @click="toDypoiOrderLs"> |
|||
<image mode="aspectFit" src="/static/images/write_off/order.png"></image> |
|||
<view>抖音团购核销记录</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">现场散客人数</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toPeopleNum"> |
|||
<image mode="aspectFit" src="/static/images/write_off/people.png"></image> |
|||
<view>现场散客人数查询</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../utils/util'; |
|||
import { WRITE_OFF_STORE_NAME } from '../../../js/once_name'; |
|||
export default { |
|||
data(){ |
|||
return { |
|||
brand_id: '' |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
this.brand_id = options?.brand_id || '' |
|||
}, |
|||
methods: { |
|||
toPeopleNum(){ |
|||
let _qryStr = `brand_id=${this.brand_id}` |
|||
util.routeTo(`/subpackage/verification/pages/site_people/index?${_qryStr}`, 'nT'); |
|||
}, |
|||
toOperate(type){ |
|||
util.$_emit(WRITE_OFF_STORE_NAME, null); |
|||
util.routeTo(`/pages/write_off/operate/operate?type=${type}`, 'nT'); |
|||
}, |
|||
toSiteList(){ |
|||
util.routeTo(`/pages/write_off/search_result/search_result`, 'nT'); |
|||
}, |
|||
toMallLs(){ |
|||
util.routeTo(`/pages/write_off/mall/list/list`, 'nT'); |
|||
}, |
|||
toDypoiOrderLs(){ |
|||
util.routeTo(`/pages/write_off/douyin/poi_list`, 'nT'); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.write-off-menu{ |
|||
padding: 60upx 68upx 0upx; |
|||
.wom-section{ |
|||
margin-bottom: 30upx; |
|||
.ws-tit{ |
|||
margin-bottom: 20upx; |
|||
font-size: 32upx; |
|||
font-weight: 500; |
|||
line-height: 44upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.ws-ls{ |
|||
@include centerFlex(space-between); |
|||
flex-wrap: wrap; |
|||
.wl-item{ |
|||
padding-top: 58upx; |
|||
margin-bottom: 32upx; |
|||
width: 288upx; |
|||
height: 220upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
>image{ |
|||
margin: 0 auto 22upx; |
|||
display: block; |
|||
width: 60upx; |
|||
height: 60upx; |
|||
} |
|||
>view{ |
|||
text-align: center; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #9c9c9f; |
|||
@include textHide(1); |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -1,70 +0,0 @@ |
|||
<template> |
|||
<view class="null-container"> |
|||
<image mode="aspectFit" :src="imgPath"></image> |
|||
<view class="c-tip" v-if="operateType == 'decrypt_text'">很抱歉!获取不到二维码订单信息</view> |
|||
<view class="c-tip" v-if="operateType == 'verify_code'">很抱歉!获取不到验证码订单信息</view> |
|||
<view class="c-btn" @click="toBlack">返回</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../utils/util'; |
|||
export default { |
|||
computed: { |
|||
imgPath(){ |
|||
let { operateType } = this; |
|||
if(operateType == 'verify_code')return '/static/images/code_null.png'; |
|||
if(operateType == 'decrypt_text')return '/static/images/scan_null.png'; |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
let { type } = options; |
|||
this.operateType = options.type |
|||
}, |
|||
data(){ |
|||
return { |
|||
isScan: false, |
|||
operateType: '', // verify_code(输入)/decrypt_text(扫码) |
|||
} |
|||
}, |
|||
methods: { |
|||
toBlack(){ |
|||
util.routeTo(); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import "~style/public.scss"; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.null-container{ |
|||
padding-top: 90upx; |
|||
>image{ |
|||
display: block; |
|||
margin: 0 auto 86upx; |
|||
width: 420upx; |
|||
height: 420upx; |
|||
} |
|||
.c-tip{ |
|||
margin-bottom: 260upx; |
|||
line-height: 40upx; |
|||
text-align: center; |
|||
font-size: 28upx; |
|||
color: #9c9c9f; |
|||
} |
|||
.c-btn{ |
|||
margin: 0 auto; |
|||
width: 280upx; |
|||
text-align: center; |
|||
height: 92upx; |
|||
line-height: 88upx; |
|||
font-size: 32upx; |
|||
border: 2upx solid $themeColor; |
|||
color: $themeColor; |
|||
border-radius: 46upx; |
|||
} |
|||
} |
|||
</style> |
@ -1,496 +0,0 @@ |
|||
<template> |
|||
<view class="number-of-people"> |
|||
<view class="nop-store-name"> |
|||
<picker :range="stadiumList" range-key="name" @change="stadiumChange"> |
|||
<view class="nsn-frame"> |
|||
<input placeholder="请选择店铺" :value="curStadium.name" disabled /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="nop-main"> |
|||
<view class="nm-date">日期:{{ dateStr || '-' }}</view> |
|||
<view class="nm-tit">现场散客人数</view> |
|||
<view class="nm-num"> |
|||
<image mode="aspectFit" src="/static/images/countdown_bg.png"></image> |
|||
<view class="nn-txt-num">{{peopleInfo.present_person_number || 0}}</view> |
|||
</view> |
|||
<view class="nm-txt" @click="checkNotLeave">查看未离场订单</view> |
|||
<view class="nm-btn" @click="isChangeNum = true">修改人数</view> |
|||
<view class="nm-line"> |
|||
<view class="nl-txt">凌晨自动清零</view> |
|||
<view class="nl-switch" @click="switchChange"> |
|||
<switch color="#009777" disabled style="transform:scale(0.8)" :checked="peopleInfo. present_person_number_clear"></switch> |
|||
</view> |
|||
</view> |
|||
<view class="nm-tip"> |
|||
<text>* 不开启凌晨自动清零,则现场灯光按【现场散客人数】去判断是否开启或关闭;修改人数会直接影响现场灯光开关!\n\r* 开启凌晨自动清零,则现场灯光按【散客订单未离场数量】去判断是否开启或关闭;修改人数不会影响现场灯光开关!但如有散客订单一直未扫码离场,可能会无法关灯,需要将未离场的散客订单设置为已离场后才可关闭灯光!</text> |
|||
</view> |
|||
</view> |
|||
<view class="ox-dark-mask" v-if="isChangeNum"> |
|||
<view class="nop-modifies-modal"> |
|||
<image class="nmm-close" @click="isChangeNum = false" src="/static/images/icon/x_close.png"></image> |
|||
<view class="nmm-tit">修改现场散客人数</view> |
|||
<view class="nmm-info"> |
|||
<view class="ni-num">当前现场散客人数为:{{peopleInfo.present_person_number || 0}}</view> |
|||
<view class="ni-ipt"> |
|||
<input placeholder="请输入散客人数" v-model="changeNum" type="number" /> |
|||
</view> |
|||
<view class="ni-tip">修改现场人数可能会影响现场灯光开关,请谨慎操作!</view> |
|||
</view> |
|||
<view class="nmm-btns"> |
|||
<view @click="isChangeNum = false">取消</view> |
|||
<view @click="confirmChange">确认</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<view class="ox-dark-mask" v-if="isNotLeave"> |
|||
<view class="nop-modifies-modal"> |
|||
<image class="nmm-close" @click="isNotLeave = false" src="/static/images/icon/x_close.png"></image> |
|||
<view class="nmm-tit nmm-btm">未离场订单</view> |
|||
<view class="nmm-line" v-if="orderNum.person_number>0"> |
|||
<view>次卡未离场:{{orderNum.person_number || 0}}</view> |
|||
<view @click="checkBtn(0)">查看</view> |
|||
</view> |
|||
<view class="nmm-line" v-if="orderNum.person_timing>0"> |
|||
<view>计时未离场:{{orderNum.person_timing || 0}}</view> |
|||
<view @click="checkBtn(1)">查看</view> |
|||
</view> |
|||
<view class="nmm-line"> |
|||
<view>年月卡未离场:{{orderNum.monthly_card||0}}</view> |
|||
<view @click="checkBtn(0)">查看</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { API } from '../../../js/api' |
|||
import { servers } from '../../../js/server' |
|||
import { mapState } from 'vuex'; |
|||
import util from '../../../utils/util'; |
|||
let timer = null; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
}, |
|||
data(){ |
|||
return { |
|||
isChangeNum: false, |
|||
stadiumList: [], |
|||
curStadium: { |
|||
name: '' |
|||
}, |
|||
peopleInfo: {}, |
|||
dateStr: '-', |
|||
changeNum: '', |
|||
|
|||
isNotLeave: false, |
|||
orderNum: {}, //未离场订单数量 |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
this.initStore(); |
|||
this.dateStr = util.formatDate({ partition: 'zh' }) || '-'; |
|||
}, |
|||
|
|||
onUnload(){ |
|||
this.clearTime(); |
|||
}, |
|||
methods: { |
|||
confirmChange: util.debounce(function(){ |
|||
let { changeNum } = this; |
|||
if(isNaN(changeNum))return util.showNone('请输入正确人数!'); |
|||
this.isChangeNum = false; |
|||
this.setStadiumPresentNumber(changeNum); |
|||
}, 200, true), |
|||
setStadiumPresentNumber(num){ |
|||
let { curStadium } = this; |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.setStadiumPresentNumber, |
|||
data: { |
|||
brand_id: curStadium.brand_id, |
|||
stadium_id: curStadium.id, |
|||
number: +num, |
|||
}, |
|||
isDefaultGet: false, |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
util.showNone(res.data.message || '操作成功!'); |
|||
setTimeout(_=>{ |
|||
this.getUserNum({ |
|||
stadium_id: curStadium.id, |
|||
brand_id: curStadium.brand_id |
|||
}) |
|||
this.initInertval(); |
|||
}, 1200) |
|||
}else{ |
|||
util.showNone(res.data.message || '操作失败!'); |
|||
} |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
initInertval(){ |
|||
this.clearTime(); |
|||
let { curStadium } = this; |
|||
if(!curStadium.id || !curStadium.brand_id)return; |
|||
timer = setInterval(_=>{ |
|||
if(!curStadium.id || !curStadium.brand_id)return this.clearTime(); |
|||
this.getUserNum({ |
|||
stadium_id: curStadium.id, |
|||
brand_id: curStadium.brand_id |
|||
}) |
|||
}, 3000); |
|||
}, |
|||
clearTime(){ |
|||
clearInterval(timer); |
|||
timer = null; |
|||
}, |
|||
|
|||
stadiumChange(e){ |
|||
let { stadiumList } = this; |
|||
let _curStadium = stadiumList[e.detail.value] || {}; |
|||
if(!_curStadium.id || !_curStadium.brand_id)return; |
|||
this.curStadium = _curStadium; |
|||
this.getUserNum({ |
|||
stadium_id: _curStadium.id, |
|||
brand_id: _curStadium.brand_id |
|||
}) |
|||
this.initInertval(); |
|||
}, |
|||
async initStore(){ |
|||
let { brandInfo } = this; |
|||
try{ |
|||
util.showLoad(); |
|||
let _storeList = await this.getStoreList({ brand_id: brandInfo.brand.id || '' }); |
|||
if(!_storeList || !_storeList.length)return util.showNone('没有店铺信息'); |
|||
this.stadiumList = _storeList || []; |
|||
let _curStadium = _storeList[0] || {}; |
|||
this.curStadium = _curStadium; |
|||
this.initInertval(); |
|||
this.getUserNum({ |
|||
stadium_id: _curStadium.id, |
|||
brand_id: _curStadium.brand_id |
|||
}) |
|||
util.hideLoad(); |
|||
}catch(err){ |
|||
util.hideLoad(); |
|||
util.showNone('初始化店铺数据失败!'); |
|||
console.warn('加载数据失败!', err); |
|||
} |
|||
}, |
|||
// 获取店铺列表 |
|||
getStoreList({ |
|||
page=1, |
|||
page_size=9999, |
|||
brand_id='', |
|||
}){ |
|||
return servers.get({ |
|||
url: API.stadiumList, |
|||
data: { |
|||
page, |
|||
page_size, |
|||
brand_id, |
|||
}, |
|||
failMsg: '获取列表失败!' |
|||
}) |
|||
.then(res=>{ |
|||
let _list = res.list || []; |
|||
return _list |
|||
}) |
|||
}, |
|||
getUserNum({ |
|||
stadium_id, |
|||
brand_id, |
|||
}){ |
|||
servers.get({ |
|||
url: API.writeOff.timingNumber, |
|||
data: { stadium_id, brand_id }, |
|||
failMsg: '加载现场人数失败!' |
|||
}) |
|||
.then(res=>{ |
|||
this.peopleInfo = res |
|||
}) |
|||
}, |
|||
|
|||
// 凌晨自动清零 - 未离场订单数量 |
|||
checkNotLeave(){ |
|||
let { curStadium } = this; |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.notLeavingNums, |
|||
data: { |
|||
brand_id: curStadium.brand_id, |
|||
stadium_id: curStadium.id, |
|||
}, |
|||
// isDefaultGet: false, |
|||
failMsg: '请求失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
this.orderNum = res |
|||
this.$nextTick(_=>{ |
|||
this.isNotLeave = true |
|||
}) |
|||
}) |
|||
}, |
|||
|
|||
checkBtn(type){ |
|||
if(type == 0)return util.routeTo(`/pages/write_off/search_result/search_result`, 'nT'); |
|||
if(type == 1)return util.routeTo(`/pages/order_list/order_list?order_type=1`, 'nT'); |
|||
}, |
|||
|
|||
switchChange(){ |
|||
let { peopleInfo, curStadium } = this |
|||
this.$nextTick(_=>{ |
|||
util.showModal({ |
|||
title: '提示', |
|||
content: peopleInfo.present_person_number_clear==false?'是否确认开启凌晨自动清零?':peopleInfo.present_person_number_clear==true?'是否确认关闭凌晨自动清零?':'', |
|||
showCancel: true, |
|||
success: modalRes=>{ |
|||
if(modalRes.confirm){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.timingOpen, //凌晨自动清零【开/关】 |
|||
data: { |
|||
brand_id: curStadium.brand_id, |
|||
stadium_id: curStadium.id, |
|||
status: peopleInfo.present_person_number_clear==false?1:peopleInfo.present_person_number_clear==true?0:'', |
|||
}, |
|||
failMsg: '请求失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
util.showNone('操作成功!'); |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
}) |
|||
}, |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.number-of-people{ |
|||
.nop-store-name{ |
|||
height: 144upx; |
|||
@include centerFlex(center); |
|||
.nsn-frame{ |
|||
padding: 0 20upx; |
|||
width: 702upx; |
|||
height: 92upx; |
|||
border-radius: 10upx; |
|||
background-color: #F2F2F7; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.nop-main{ |
|||
padding: 8upx 0upx 0; |
|||
.nm-date{ |
|||
margin: 0 24rpx 86rpx; |
|||
line-height: 44upx; |
|||
font-size: 32upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.nm-tit{ |
|||
margin: 0 30rpx 16rpx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
font-weight: 500; |
|||
} |
|||
.nm-num{ |
|||
position: relative; |
|||
margin: 0 auto; |
|||
display: block; |
|||
width: 400upx; |
|||
height: 400upx; |
|||
.nn-txt-num{ |
|||
line-height: 400upx; |
|||
text-align: center; |
|||
font-size: 96upx; |
|||
font-weight: 500; |
|||
color: $themeColor; |
|||
} |
|||
>image { |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
z-index: -1; |
|||
margin-left: -250upx; |
|||
margin-top: -250upx; |
|||
display: block; |
|||
width: 500upx; |
|||
height: 500upx; |
|||
animation: Rotate 6s linear infinite |
|||
} |
|||
@keyframes Rotate{ |
|||
0% {transform: rotate(360deg);} |
|||
50% {transform: rotate(180deg);} |
|||
100% {transform: rotate(0deg);} |
|||
} |
|||
} |
|||
.nm-txt{ |
|||
margin: 10rpx auto 42rpx; |
|||
color: #9C9C9F; |
|||
font-size: 28rpx; |
|||
text-align: center; |
|||
line-height: 40rpx; |
|||
text-decoration: underline; |
|||
} |
|||
.nm-btn{ |
|||
margin: 0 auto; |
|||
width: 618upx; |
|||
line-height: 112upx; |
|||
height: 112upx; |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
font-size: 38upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
.nm-line{ |
|||
margin: 46rpx 0 0; |
|||
padding: 34rpx 28rpx 20rpx 34rpx; |
|||
border-top: 2rpx solid #F2F2F7; |
|||
@include centerFlex(space-between); |
|||
.nl-txt{ |
|||
color: #1A1A1A; |
|||
font-size: 32rpx; |
|||
line-height: 44rpx; |
|||
} |
|||
|
|||
.nl-switch{ |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
} |
|||
} |
|||
.nm-tip{ |
|||
margin: 0 32rpx 30rpx 34rpx; |
|||
font-size: 28upx; |
|||
line-height: 52upx; |
|||
color: #9C9C9F; |
|||
} |
|||
|
|||
} |
|||
.nop-modifies-modal{ |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding-top: 78upx; |
|||
width: 620upx; |
|||
height: 706upx; |
|||
background-color: #fff; |
|||
border-radius: 10upx; |
|||
.nmm-close{ |
|||
position: absolute; |
|||
right: 30upx; |
|||
top: 30upx; |
|||
width: 34upx; |
|||
height: 34upx; |
|||
} |
|||
.nmm-tit{ |
|||
line-height: 44upx; |
|||
text-align: center; |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
color: #1A1A1A; |
|||
} |
|||
.nmm-info{ |
|||
padding: 54upx 80upx 80upx; |
|||
.ni-num{ |
|||
margin-bottom: 30upx; |
|||
font-size: 28upx; |
|||
line-height: 48upx; |
|||
color: #1A1A1A; |
|||
@include textHide(1); |
|||
} |
|||
.ni-ipt{ |
|||
margin-bottom: 26upx; |
|||
padding: 0 20upx; |
|||
height: 88upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid #D8D8D8; |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
} |
|||
.ni-tip{ |
|||
font-size: 24upx; |
|||
line-height: 34upx; |
|||
color: #EA5061; |
|||
} |
|||
} |
|||
.nmm-btns{ |
|||
@include centerFlex(center); |
|||
>view{ |
|||
margin: 0 10upx; |
|||
width: 240upx; |
|||
height: 88upx; |
|||
line-height: 84upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid $themeColor; |
|||
color: $themeColor; |
|||
&+view{ |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
} |
|||
} |
|||
.nmm-btm{ |
|||
margin-bottom: 8rpx; |
|||
} |
|||
.nmm-line{ |
|||
margin: 78rpx 70rpx 0 74rpx; |
|||
@include centerFlex(space-between); |
|||
>view{ |
|||
&:first-child{ |
|||
color: #1A1A1A; |
|||
font-size: 28rpx; |
|||
line-height: 48rpx; |
|||
} |
|||
&:nth-child(2){ |
|||
width: 156rpx; |
|||
height: 68rpx; |
|||
border: 2rpx solid #009874; |
|||
border-radius: 10rpx; |
|||
color: #009874; |
|||
font-size: 32rpx; |
|||
line-height: 64rpx; |
|||
text-align: center; |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -1,363 +0,0 @@ |
|||
<template> |
|||
<view class="operate-container"> |
|||
<view class="store-bar"> |
|||
<text>当前门店</text> |
|||
<picker mode="selector" :range="stadiumList" range-key="name" @change="stadiumChange"> |
|||
<view> |
|||
<input disabled v-model="curStadium.name" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="c-scan-btn" @click="scanCodeBtn"> |
|||
<image mode="aspectFit" src="/static/images/icon/scan_code_btn.png"></image> |
|||
</view> |
|||
<view class="c-verification-code"> |
|||
<view><input placeholder="输入订单验证码" v-model="iptCode" /></view> |
|||
<view @click="confirmBtn">确认核销</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../utils/util'; |
|||
import { API } from '../../../js/api'; |
|||
import { servers } from '../../../js/server'; |
|||
import { WRITE_OFF_STORE_NAME, WRITE_OFF_ORDER_INFO, WRITE_OFF_MALL_ORDER_INFO } from '../../../js/once_name'; |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
data(){ |
|||
return { |
|||
iptCode: '', |
|||
stadiumList: [], |
|||
curStadium: {}, |
|||
|
|||
writeOffType: '', // 新增核销类型 site(场地订单)/ mall(商城订单)/ dypoi(抖音团购) |
|||
|
|||
} |
|||
}, |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
}, |
|||
onLoad(options){ |
|||
this.writeOffType = options.type || ''; |
|||
util.$_once(WRITE_OFF_STORE_NAME, data => { // 定位门店 |
|||
if(!data)return this.initStore(); |
|||
this.curStadium = data.curStadium; |
|||
this.stadiumList = data.stadiumList; |
|||
}) |
|||
|
|||
}, |
|||
methods: { |
|||
async initStore(){ |
|||
let { brandInfo } = this; |
|||
try{ |
|||
util.showLoad(); |
|||
let _storeList = await this.getStoreList({ brand_id: brandInfo.brand.id || '' }); |
|||
if(!_storeList || !_storeList.length)return util.showNone('没有店铺信息'); |
|||
this.stadiumList = _storeList || []; |
|||
if(_storeList.length) this.curStadium = _storeList[0]; |
|||
util.hideLoad(); |
|||
}catch(err){ |
|||
util.hideLoad(); |
|||
util.showNone('初始化店铺数据失败!'); |
|||
} |
|||
}, |
|||
// 获取店铺列表 |
|||
getStoreList({ |
|||
page=1, |
|||
page_size=99999, |
|||
brand_id='', |
|||
}){ |
|||
return servers.get({ |
|||
url: API.stadiumList, |
|||
data: { |
|||
page, |
|||
page_size, |
|||
brand_id, |
|||
}, |
|||
failMsg: '获取列表失败!' |
|||
}) |
|||
.then(res=>{ |
|||
let _list = res.list || []; |
|||
return _list |
|||
}) |
|||
}, |
|||
|
|||
scanCodeBtn: util.debounce(function(){ |
|||
uni.scanCode({ |
|||
onlyFromCamera: true, |
|||
scanType: 'qrCode', |
|||
success: res=> { |
|||
if(util.changeLowerCase(res.scanType) !== 'qr_code')return util.showNone('不支持此类型!'); |
|||
|
|||
this.analysisOrder({ decrypt_text: res.result }); |
|||
}, |
|||
fail: function(err) { |
|||
util.showNone('扫码失败!'); |
|||
console.warn('扫码失败--->', err); |
|||
} |
|||
}) |
|||
}, 300, true), |
|||
stadiumChange(e){ |
|||
let { stadiumList } = this; |
|||
this.curStadium = stadiumList[e.detail.value]; |
|||
}, |
|||
confirmBtn: util.debounce(function(){ |
|||
let { iptCode } = this; |
|||
if(!iptCode)return util.showNone('请输入核销码!'); |
|||
this.analysisOrder({ verify_code: this.iptCode }); |
|||
}, 300, true), |
|||
|
|||
|
|||
// 核销请求 |
|||
analysisOrder({ verify_code = '', decrypt_text = '' }){ |
|||
let { curStadium, writeOffType } = this; |
|||
if(!verify_code&&!decrypt_text)return; |
|||
let _query = { |
|||
brand_id: curStadium.brand_id, |
|||
stadium_id: curStadium.id, |
|||
} |
|||
let _vType = ''; |
|||
if(!!verify_code){ |
|||
_vType = 'verify_code'; |
|||
writeOffType == 'site'&&(_query['verify_code'] = verify_code); |
|||
writeOffType == 'mall'&&(_query['vcode'] = verify_code); |
|||
} |
|||
if(!!decrypt_text){ |
|||
_vType = 'decrypt_text'; |
|||
writeOffType == 'site'&&(_query['decrypt_text'] = decrypt_text); |
|||
writeOffType == 'mall'&&(_query['vcode'] = decrypt_text); |
|||
} |
|||
if(writeOffType == 'site')return this.siteGet({ query: _query, vType: _vType, }); |
|||
if(writeOffType == 'mall')return this.mallGet({ query: _query, vType: _vType, }); |
|||
if(writeOffType == 'dypoi'){ |
|||
let _code = verify_code; |
|||
if(decrypt_text){ |
|||
try{ |
|||
_code = JSON.parse(decrypt_text)?.code; |
|||
}catch(err){console.warn(err)} |
|||
} |
|||
return this.dypoiGet({ |
|||
..._query, |
|||
code: _code, |
|||
}); |
|||
} |
|||
}, |
|||
// 抖音团购 |
|||
dypoiGet(query){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.dyPoiEnterVerifyOrder, |
|||
data: query, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
let { code, data, message } = res?.data || {}; |
|||
if(code!==0)return util.showModal({ |
|||
title: '提示', |
|||
content: message || '查询失败!', |
|||
confirmText: '好的' |
|||
}) |
|||
if(data?.order?.order_no)return util.showModal({ |
|||
title: data?.order?.product_cache?.name || '提示', |
|||
content: '核销数量:1', |
|||
showCancel: true, |
|||
confirmText: '确认核销', |
|||
cancelText: '取消', |
|||
success: res=>{ |
|||
if(res.confirm){ |
|||
this.dypoiConfirm({ ...query }); |
|||
} |
|||
} |
|||
}) |
|||
console.log('订单查询---->', res); |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
dypoiConfirm({ |
|||
stadium_id = '', |
|||
brand_id = '', |
|||
code = '', |
|||
}){ |
|||
util.showLoad(); |
|||
servers.post({ |
|||
url: API.writeOff.dyPoiAssistantVerify, |
|||
data: { |
|||
stadium_id, |
|||
brand_id, |
|||
code, |
|||
}, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
let { code, data, message } = res?.data || {}; |
|||
if(code!==0)return util.showModal({ |
|||
title: '提示', |
|||
content: message || '核销失败!', |
|||
confirmText: '好的' |
|||
}) |
|||
|
|||
util.showModal({ |
|||
title: '提示', |
|||
content: message || '核销成功!', |
|||
confirmText: '关闭' |
|||
}) |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
// 商城订单 |
|||
mallGet({ query = {}, vType = '', }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.shop2WriteoffGet, |
|||
data: query, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
let _data = res.data.data || {}; |
|||
if(_data.has_order){ |
|||
util.$_emit(WRITE_OFF_MALL_ORDER_INFO, {..._data.order || {}}); |
|||
util.routeTo(`/pages/write_off/mall/confirm/confirm?type=${vType}`, 'nT'); |
|||
}else{ |
|||
util.routeTo(`/pages/write_off/null/null?type=${vType}`, 'nT'); |
|||
} |
|||
}else{ |
|||
util.showNone(res.data.message || '操作失败!') |
|||
} |
|||
|
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
|
|||
// 场地/ 年月卡 / 赛事 |
|||
// @vType verify_code(扫码)/ decrypt_text(输入) |
|||
|
|||
siteGet({ query = {}, vType = '', }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.enterVerifyOrder, |
|||
data: query, |
|||
isDefaultGet: false |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
let _data = res.data.data || {} |
|||
|
|||
// 年月卡 |
|||
if(_data.extension&&_data.extension.verify_order_type === 'monthly_card'){ |
|||
util.$_emit(WRITE_OFF_ORDER_INFO, { data: _data, query }); |
|||
util.routeTo(`/pages/write_off/ym_confirm/ym_confirm?type=${vType}`, 'nT'); |
|||
return |
|||
} |
|||
|
|||
// 赛事 |
|||
if(_data.extension&&_data.extension.verify_order_type === 'match_order'){ |
|||
util.$_emit(WRITE_OFF_ORDER_INFO, {..._data}); |
|||
util.routeTo(`/pages/write_off/events_order/events_order?type=${vType}`, 'nT'); |
|||
return |
|||
} |
|||
|
|||
util.$_emit(WRITE_OFF_ORDER_INFO, {..._data}); |
|||
util.routeTo(`/pages/write_off/confirm_order/confirm_order?type=${vType}`, 'nT'); |
|||
}else{ |
|||
util.routeTo(`/pages/write_off/null/null?type=${vType}`, 'nT'); |
|||
} |
|||
console.log('订单查询---->', res); |
|||
}) |
|||
.catch(util.hideLoad) |
|||
} |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #f2f2f7; |
|||
} |
|||
.operate-container{ |
|||
.store-bar{ |
|||
margin-bottom: 24upx; |
|||
padding: 0 24upx; |
|||
height: 144upx; |
|||
background-color: #fff; |
|||
@include centerFlex(space-between); |
|||
>text{ |
|||
margin-right: 20upx; |
|||
flex-shrink: 0; |
|||
font-size: 28upx; |
|||
color: #9C9C9F; |
|||
} |
|||
>picker{ |
|||
flex-grow: 1; |
|||
} |
|||
view{ |
|||
padding: 0 20upx; |
|||
height: 92upx; |
|||
border-radius: 10upx; |
|||
background: #f2f2f2; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.c-scan-btn{ |
|||
margin: 0 auto 24upx; |
|||
width: 702upx; |
|||
height: 360upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
@include centerFlex(center); |
|||
>image{ |
|||
width: 172upx; |
|||
height: 172upx; |
|||
} |
|||
} |
|||
.c-verification-code{ |
|||
padding: 40upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
>view{ |
|||
&:first-child{ |
|||
margin-bottom: 30upx; |
|||
padding: 0 20upx; |
|||
height: 112upx; |
|||
border-radius: 10upx; |
|||
background-color: #f2f2f7; |
|||
>input{ |
|||
height: 100%; |
|||
width: 100%; |
|||
font-size: 32upx; |
|||
color: #1a1a1a; |
|||
} |
|||
} |
|||
&+view{ |
|||
height: 112upx; |
|||
text-align: center; |
|||
line-height: 112upx; |
|||
border-radius: 10upx; |
|||
font-size: 32upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -1,339 +0,0 @@ |
|||
<template> |
|||
<view class="search-result"> |
|||
<view class="store-bar"> |
|||
<text>当前门店</text> |
|||
<picker mode="selector" :range="stadiumList" range-key="name" @change="stadiumChange"> |
|||
<view> |
|||
<input disabled v-model="curStadium.name" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="r-timer-select"> |
|||
<picker mode="date" @change="dateChange"> |
|||
<view> |
|||
<text>核销日期:{{curDate || '-'}}</text> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
<view>核销数量:{{writeOffList.length || 0}}</view> |
|||
</view> |
|||
<view class="r-order-list"> |
|||
<view class="l-item" v-for="(e, i) in writeOffList" :key="i"> |
|||
<view class="i-name">{{ e.extension.stadium_name || '-' }}</view> |
|||
<view class="i-lines"> |
|||
<view> |
|||
<view>订单编号:{{ e.order_no || '-' }}</view> |
|||
<view>({{ e.type || '-' }})</view> |
|||
</view> |
|||
<view> |
|||
<view>用户信息:{{ e.extension.user_phone || '-' }}({{ e.extension.nickname || '-' }})</view> |
|||
</view> |
|||
<view> |
|||
<view>核销码: {{e.verify_code || '-' }}</view> |
|||
</view> |
|||
<view> |
|||
<view>验证方式:{{ e.desc || '-' }}</view> |
|||
</view> |
|||
<view> |
|||
<view>核销时间:{{ e.verify_time || '-'}}</view> |
|||
</view> |
|||
<view> |
|||
<view>离场时间:{{ e.verify_leave_time || ''}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="i-btn" v-if="e.verify_leave_time==''" @click="leaveBtn(e)">手动离场</view> |
|||
</view> |
|||
</view> |
|||
<view class="r-bottom-btn"><view @click="toOperate">核销订单</view></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../utils/util'; |
|||
import { API } from '../../../js/api'; |
|||
import { servers } from '../../../js/server'; |
|||
import { mapState } from 'vuex'; |
|||
import { WRITE_OFF_STORE_NAME } from '../../../js/once_name'; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
}, |
|||
data(){ |
|||
return { |
|||
stadiumList: [], // 店铺列表 |
|||
curStadium: {}, // 当前店铺 |
|||
writeOffList: [], // 核销列表, |
|||
curDate: util.formatDate({}), |
|||
page: 1, |
|||
totalNum: 0, |
|||
} |
|||
}, |
|||
// 20210716测试:取消分页,返回当天 |
|||
// onReachBottom(){ |
|||
// let { page, curDate, curStadium } = this; |
|||
// this.getList({ |
|||
// brand_id: curStadium.brand_id || '', |
|||
// stadium_id: curStadium.id || '', |
|||
// date: curDate || '', |
|||
// page: ++page, |
|||
// }); |
|||
// }, |
|||
onLoad(){ |
|||
this.initPage(); |
|||
}, |
|||
onShow(){ |
|||
let { curStadium } = this; |
|||
if(curStadium&&curStadium.id)this.refreshList(); |
|||
}, |
|||
methods: { |
|||
refreshList(){ |
|||
let { curDate, curStadium } = this; |
|||
this.page = 1; |
|||
this.writeOffList = []; |
|||
this.getList({ |
|||
brand_id: curStadium.brand_id || '', |
|||
stadium_id: curStadium.id || '', |
|||
date: curDate || '', |
|||
}); |
|||
}, |
|||
|
|||
dateChange(e){ |
|||
this.curDate = e.detail.value; |
|||
this.$nextTick(this.refreshList); |
|||
}, |
|||
stadiumChange(e){ |
|||
let { stadiumList } = this; |
|||
this.curStadium = stadiumList[e.detail.value]; |
|||
this.$nextTick(this.refreshList); |
|||
}, |
|||
|
|||
async initPage(){ |
|||
let { brandInfo } = this; |
|||
try{ |
|||
let _storeList = await this.getStoreList({ brand_id: brandInfo.brand.id || '' }); |
|||
this.stadiumList = _storeList || []; |
|||
if(_storeList.length) this.curStadium = _storeList[0]; |
|||
this.$nextTick(this.refreshList); |
|||
}catch(err){ |
|||
console.warn('加载数据失败!', err); |
|||
} |
|||
}, |
|||
toOperate(){ |
|||
let { stadiumList, curStadium } = this; |
|||
util.$_emit(WRITE_OFF_STORE_NAME, { |
|||
stadiumList, |
|||
curStadium, |
|||
}) |
|||
util.routeTo(`/pages/write_off/operate/operate?type=site`, 'nT'); |
|||
}, |
|||
getList({ brand_id, stadium_id = '', date = '', page = 1, page_size = '' }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.listVerifyRecord, |
|||
data: { brand_id, stadium_id, date, page, page_size }, |
|||
failMsg: '加载失败!', |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
this.totalNum = res.total || 0; |
|||
let _list = res.list || []; |
|||
if(page == 1)return this.writeOffList = _list; |
|||
if(!_list.length)return util.showNone('没有更多!'); |
|||
this.page = page; |
|||
this.writeOffList = [...this.writeOffList, ..._list]; |
|||
|
|||
}) |
|||
}, |
|||
getStoreList({ |
|||
page=1, |
|||
page_size=9999, |
|||
brand_id='', |
|||
}){ |
|||
return servers.get({ |
|||
url: API.stadiumList, |
|||
data: { |
|||
page, |
|||
page_size, |
|||
brand_id, |
|||
}, |
|||
failMsg: '获取列表失败!' |
|||
}) |
|||
.then(res=>{ |
|||
let _list = res.list || []; |
|||
return _list |
|||
}) |
|||
}, |
|||
|
|||
leaveBtn(item){ |
|||
let { curStadium } = this; |
|||
util.showModal({ |
|||
title: '提示', |
|||
content: '是否确认手动离场?', |
|||
showCancel: true, |
|||
success: modalRes=>{ |
|||
if(modalRes.confirm){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.leaveVerifyOrder, |
|||
data: { |
|||
brand_id: curStadium.brand_id, |
|||
id: item.id, |
|||
}, |
|||
failMsg: '请求失败!' |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
util.showNone('操作成功!'); |
|||
this.refreshList() |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import "~style/public.scss"; |
|||
page{ |
|||
background-color: #f2f2f7; |
|||
} |
|||
.search-result{ |
|||
padding-bottom: 132upx; |
|||
padding-bottom: calc( 132upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 132upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
.store-bar{ |
|||
padding: 0 24upx; |
|||
height: 144upx; |
|||
background-color: #fff; |
|||
@include centerFlex(space-between); |
|||
>text{ |
|||
margin-right: 20upx; |
|||
flex-shrink: 0; |
|||
font-size: 28upx; |
|||
color: #9C9C9F; |
|||
} |
|||
>picker{ |
|||
flex-grow: 1; |
|||
} |
|||
view{ |
|||
padding: 0 20upx; |
|||
height: 92upx; |
|||
border-radius: 10upx; |
|||
background: #f2f2f2; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.r-timer-select{ |
|||
padding: 0 24upx; |
|||
margin-bottom: 10upx; |
|||
@include centerFlex(space-between); |
|||
picker{ |
|||
flex-shrink: 0; |
|||
view{ |
|||
padding: 24upx 0; |
|||
>text{ |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
} |
|||
>image{ |
|||
margin-left: 16upx; |
|||
vertical-align: middle; |
|||
width: 22upx; |
|||
height: 22upx; |
|||
} |
|||
} |
|||
} |
|||
>view{ |
|||
max-width: 40%; |
|||
text-align: right; |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
.r-order-list{ |
|||
padding: 0 24upx; |
|||
.l-item{ |
|||
position: relative; |
|||
margin-bottom: 24upx; |
|||
padding: 0 20upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
.i-name{ |
|||
height: 100upx; |
|||
line-height: 98upx; |
|||
border-bottom: 2upx solid #D8D8D8; |
|||
font-weight: 500; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.i-lines{ |
|||
padding-top: 8upx; |
|||
padding-bottom: 32upx; |
|||
>view{ |
|||
display: flex; |
|||
>view{ |
|||
min-width: 0; |
|||
line-height: 52upx; |
|||
font-size: 28upx; |
|||
color: #9c9c9f; |
|||
@include textHide(1); |
|||
&+view{ |
|||
flex-shrink: 0; |
|||
color: $themeColor; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
.i-btn{ |
|||
position: absolute; |
|||
right: 20rpx; |
|||
bottom: 32rpx; |
|||
background-color: #009874; |
|||
border-radius: 10rpx; |
|||
width: 156rpx; |
|||
height: 68rpx; |
|||
color: #FFFFFF; |
|||
font-size: 28rpx; |
|||
text-align: center; |
|||
line-height: 68rpx; |
|||
} |
|||
} |
|||
} |
|||
.r-bottom-btn{ |
|||
position: fixed; |
|||
left: 0; |
|||
bottom: 0; |
|||
width: 100%; |
|||
padding: 10upx 24upx; |
|||
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
background-color: #f2f2f7; |
|||
>view{ |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
} |
|||
} |
|||
</style> |
Before Width: 380 | Height: 380 | Size: 7.4 KiB |
Before Width: 700 | Height: 700 | Size: 33 KiB |
Before Width: 380 | Height: 380 | Size: 8.5 KiB |
Before Width: 420 | Height: 420 | Size: 11 KiB |
Before Width: 128 | Height: 128 | Size: 1.4 KiB |
Before Width: 128 | Height: 128 | Size: 1.0 KiB |
Before Width: 128 | Height: 128 | Size: 1.8 KiB |
Before Width: 120 | Height: 120 | Size: 1.4 KiB |