-
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 |