Browse Source
Merge branch 'dev' of https://git.ouxuan.net/liujw/ox_zhiNengZhuShou into tid1523
tid1731
Merge branch 'dev' of https://git.ouxuan.net/liujw/ox_zhiNengZhuShou into tid1523
tid1731
18 changed files with 981 additions and 12 deletions
-
17src/pages.json
-
2src/pages/index/index.vue
-
11src/pages/write_off/menu/menu.vue
-
2src/pages/write_off/operate/operate.vue
-
8src/pages/write_off/ym_confirm/ym_confirm.vue
-
12src/subpackage/verification/js/api.js
-
10src/subpackage/verification/js/server.js
-
284src/subpackage/verification/pages/site_people/index.vue
-
66src/subpackage/verification/pages/site_people/modules/auto_clean.vue
-
73src/subpackage/verification/pages/site_people/modules/classify_tab.vue
-
62src/subpackage/verification/pages/site_people/modules/methods_bar.vue
-
155src/subpackage/verification/pages/site_people/modules/modify_number.vue
-
127src/subpackage/verification/pages/site_people/modules/not_leave_modal.vue
-
67src/subpackage/verification/pages/site_people/modules/number_show.vue
-
97src/subpackage/verification/pages/site_people/modules/stadium_select.vue
-
BINsrc/subpackage/verification/static/images/arrow_c33.png
-
BINsrc/subpackage/verification/static/images/countdown_bg.png
-
BINsrc/subpackage/verification/static/images/x_close.png
@ -0,0 +1,12 @@ |
|||||
|
import { ORIGIN } from '@/js/api'; |
||||
|
|
||||
|
export const SUB_API = { |
||||
|
stadiumList: `${ORIGIN}/admin/stadium/list`, // 店铺列表
|
||||
|
skNumber: `${ORIGIN}/stadium/sk/number`, // 散客人数 - 进场人数
|
||||
|
skNotLeavingNums: `${ORIGIN}/stadium/sk/notLeavingNums`, // 【1001536】散客人数 - 未离场订单数量
|
||||
|
setStadiumPresentNumber: `${ORIGIN}/admin/stadium/setStadiumPresentNumber`, // 商家助手散客人数校正
|
||||
|
timingOpen: `${ORIGIN}/stadium/person/timing/open`, // 【20220208】凌晨自动清零【开/关】
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
export default SUB_API; |
@ -0,0 +1,10 @@ |
|||||
|
import { Server } from '../../../js/server'; |
||||
|
|
||||
|
class SubServer extends Server { |
||||
|
constructor(props){ |
||||
|
super(props) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
export default new SubServer(); |
@ -0,0 +1,284 @@ |
|||||
|
<template> |
||||
|
<view class="site-people"> |
||||
|
<stadium-select |
||||
|
ref="stadiumSelect" |
||||
|
@change:stadium="stadiumChange" |
||||
|
></stadium-select> |
||||
|
<methods-bar |
||||
|
:type="igsType" |
||||
|
></methods-bar> |
||||
|
|
||||
|
<classify-tab |
||||
|
v-if="[1, 2].includes(igsType)&&tabLs.length" |
||||
|
:tabs="tabLs" |
||||
|
@click:tab="tabLs = $event" |
||||
|
></classify-tab> |
||||
|
|
||||
|
<number-show :num="siteNum"></number-show> |
||||
|
|
||||
|
<view class="sp-modify" @click="modifyBtn">修改人数</view> |
||||
|
<view class="sp-check" @click="checkNotLeaveBtn">查看未离场订单</view> |
||||
|
|
||||
|
<auto-clean |
||||
|
:auto-clean="siteInfo.present_person_number_clear" |
||||
|
@switch:change="switchAutoClean" |
||||
|
></auto-clean> |
||||
|
|
||||
|
<modify-number ref="modifyNum"></modify-number> |
||||
|
<not-leave-modal ref="notLeaveModal"></not-leave-modal> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import stadium_select from "./modules/stadium_select.vue"; |
||||
|
import auto_clean from "./modules/auto_clean.vue"; |
||||
|
import methods_bar from "./modules/methods_bar.vue"; |
||||
|
import classify_tab from "./modules/classify_tab.vue"; |
||||
|
import number_show from "./modules/number_show.vue"; |
||||
|
import modify_number from "./modules/modify_number.vue"; |
||||
|
import not_leave_modal from './modules/not_leave_modal.vue'; |
||||
|
import API from "../../js/api.js"; |
||||
|
import server from "../../js/server.js"; |
||||
|
import { showLoad, hideLoad, showNone } from "@/utils/util.js"; |
||||
|
export default { |
||||
|
components: { |
||||
|
'stadium-select': stadium_select, |
||||
|
'auto-clean': auto_clean, |
||||
|
'methods-bar': methods_bar, |
||||
|
'classify-tab': classify_tab, |
||||
|
'number-show': number_show, |
||||
|
'modify-number': modify_number, |
||||
|
'not-leave-modal': not_leave_modal |
||||
|
}, |
||||
|
computed: { |
||||
|
igsType(){ |
||||
|
// 0时用,对应门店人数/ 1时用,对应门禁人数/ 2时用,对应场地分类人数 |
||||
|
return this.siteInfo?.igs_type || 0; |
||||
|
}, |
||||
|
// 现场人数 |
||||
|
siteNum(){ |
||||
|
let { igsType, siteInfo, tabLs } = this; |
||||
|
if(igsType === 0) return siteInfo?.stadium_num || 0; |
||||
|
if([1,2].includes(igsType)){ |
||||
|
let _tab = tabLs.find(e=>e.selected); |
||||
|
return _tab?.number || 0; |
||||
|
}; |
||||
|
return 0 |
||||
|
} |
||||
|
}, |
||||
|
data(){ |
||||
|
return { |
||||
|
stadiumInfo: {}, |
||||
|
siteInfo: {}, |
||||
|
tabLs: [ |
||||
|
// { [label], [key], [number], [selected] } |
||||
|
], |
||||
|
intervalTimer: null |
||||
|
} |
||||
|
}, |
||||
|
async onLoad(options){ |
||||
|
this.$refs.stadiumSelect.initStadium(options?.brand_id || '') |
||||
|
.then(stadiumInfo=>{ |
||||
|
if(!stadiumInfo?.id) return; |
||||
|
this.stadiumInfo = stadiumInfo; |
||||
|
this.initData({ |
||||
|
brand_id: options?.brand_id || '', |
||||
|
stadium_id: stadiumInfo?.id || '' |
||||
|
}) |
||||
|
}) |
||||
|
}, |
||||
|
onShow(){ |
||||
|
this.setTimer(); |
||||
|
}, |
||||
|
onHide(){ |
||||
|
this.clearTimer(this.intervalTimer); |
||||
|
}, |
||||
|
onUnload(){ |
||||
|
this.clearTimer(this.intervalTimer); |
||||
|
}, |
||||
|
methods: { |
||||
|
setTimer(){ |
||||
|
this.intervalTimer = setInterval(()=>{ |
||||
|
let { brand_id, id } = this.stadiumInfo; |
||||
|
if(!brand_id || !id) return; |
||||
|
this.refreshData({ brand_id, stadium_id: id }); |
||||
|
}, 5000) |
||||
|
}, |
||||
|
clearTimer(timer){ |
||||
|
try{ |
||||
|
clearInterval(timer); |
||||
|
timer = null; |
||||
|
}catch(err){ |
||||
|
} |
||||
|
}, |
||||
|
stadiumChange(sInfo){ |
||||
|
if(!sInfo?.id) return; |
||||
|
this.stadiumInfo = sInfo; |
||||
|
this.initData({ |
||||
|
brand_id: sInfo?.brand_id || '', |
||||
|
stadium_id: sInfo?.id || '' |
||||
|
}) |
||||
|
}, |
||||
|
async initData({ brand_id, stadium_id }){ |
||||
|
try{ |
||||
|
showLoad(); |
||||
|
let _skInfo = await this.getSkNumber({ brand_id, stadium_id }); |
||||
|
hideLoad(); |
||||
|
this.resetData(_skInfo); |
||||
|
}catch(err){ |
||||
|
console.warn('site people index initData err', err); |
||||
|
} |
||||
|
}, |
||||
|
// 重置页面数据 |
||||
|
resetData(res){ |
||||
|
this.siteInfo = res || {}; |
||||
|
this.tabLs = []; |
||||
|
if([1,2].includes(res?.igs_type)){ |
||||
|
let _tabLs = this.getTabList(res); |
||||
|
_tabLs[0].selected = true; |
||||
|
this.tabLs = _tabLs; |
||||
|
} |
||||
|
}, |
||||
|
async refreshData({ brand_id, stadium_id }){ |
||||
|
let { siteInfo, tabLs } = this; |
||||
|
let _skInfo = await this.getSkNumber({ brand_id, stadium_id }); |
||||
|
if(_skInfo?.igs_type === siteInfo?.igs_type){ |
||||
|
if(_skInfo?.igs_type === 0)return this.siteInfo = _skInfo; |
||||
|
let _tabLs = this.getTabList(_skInfo); |
||||
|
let _selectedTab = tabLs.find(e=>e.selected); |
||||
|
let _newTabIdx = _tabLs.findIndex(e=>e.key === _selectedTab?.key); |
||||
|
if(_newTabIdx > -1){ |
||||
|
_tabLs[_newTabIdx].selected = true; |
||||
|
this.tabLs = _tabLs; |
||||
|
this.siteInfo = _skInfo; |
||||
|
}else{ |
||||
|
this.resetData(_skInfo); |
||||
|
} |
||||
|
}else{ |
||||
|
this.resetData(_skInfo); |
||||
|
} |
||||
|
this.$forceUpdate(); |
||||
|
|
||||
|
}, |
||||
|
getSkNumber({ brand_id, stadium_id }){ |
||||
|
return server.post({ |
||||
|
url: API.skNumber, |
||||
|
data: { |
||||
|
brand_id, |
||||
|
stadium_id, |
||||
|
}, |
||||
|
failMsg: '加载现场人数信息失败!' |
||||
|
}) |
||||
|
.then(res=>{ |
||||
|
// if(stadium_id === 156){ |
||||
|
// res.igs_type = 1; |
||||
|
// res.hw_num = [ |
||||
|
// { gate_id: 1, gate_name: 'A门', number: 10 }, |
||||
|
// { gate_id: 2, gate_name: 'B门', number: 20 }, |
||||
|
// { gate_id: 3, gate_name: 'C门', number: 30 }, |
||||
|
// ] |
||||
|
// } |
||||
|
// if(stadium_id === 151){ |
||||
|
// res.igs_type = 2; |
||||
|
// res.vt_num = [ |
||||
|
// { venue_type_key: 1, venue_type_name: '羽毛球', number: 101 }, |
||||
|
// { venue_type_key: 2, venue_type_name: '篮球', number: 210 }, |
||||
|
// { venue_type_key: 3, venue_type_name: '乒乓球', number: 310 }, |
||||
|
// ] |
||||
|
// } |
||||
|
return res || {}; |
||||
|
}) |
||||
|
.catch(err=>{ |
||||
|
console.warn('site people index getSkNumber', err); |
||||
|
}) |
||||
|
}, |
||||
|
getTabList(res){ |
||||
|
let _ls = []; |
||||
|
if(res?.igs_type === 1){ // 门禁 |
||||
|
res?.hw_num?.forEach(e=>{ |
||||
|
if(e?.gate_id)_ls.push({ |
||||
|
label: e?.gate_name || '', |
||||
|
key: e?.gate_id, |
||||
|
number: e?.number || 0 |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
if(res?.igs_type === 2){ // 场地分类 |
||||
|
res?.vt_num?.forEach(e=>{ |
||||
|
if(e?.venue_type_key)_ls.push({ |
||||
|
label: e?.venue_type_name || '', |
||||
|
key: e?.venue_type_key, |
||||
|
number: e?.number || 0 |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
return _ls; |
||||
|
}, |
||||
|
modifyBtn(){ |
||||
|
let { siteNum, stadiumInfo, tabLs, igsType } = this; |
||||
|
let { brand_id, id } = stadiumInfo; |
||||
|
this.$refs.modifyNum.initData({ |
||||
|
num: siteNum, |
||||
|
brand_id, |
||||
|
stadium_id: id, |
||||
|
igsType, |
||||
|
key: tabLs.find(e=>e.selected)?.key, |
||||
|
success: ()=>{ |
||||
|
this.refreshData({ brand_id, stadium_id: id }); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
// 自动清零状态切换 |
||||
|
switchAutoClean(status){ |
||||
|
let { brand_id, id } = this.stadiumInfo; |
||||
|
server.get({ |
||||
|
url: API.timingOpen, |
||||
|
data: { |
||||
|
brand_id: brand_id, |
||||
|
stadium_id: id, |
||||
|
status: status |
||||
|
}, |
||||
|
failMsg: '操作失败!' |
||||
|
}) |
||||
|
.then(res=>{ |
||||
|
hideLoad(); |
||||
|
showNone('操作成功!'); |
||||
|
setTimeout(_=>{ |
||||
|
this.refreshData({ brand_id, stadium_id: id }); |
||||
|
}, 1000) |
||||
|
}) |
||||
|
}, |
||||
|
checkNotLeaveBtn(){ |
||||
|
let { tabLs, stadiumInfo, igsType } = this; |
||||
|
let { brand_id, id } = stadiumInfo; |
||||
|
this.$refs.notLeaveModal.initData({ |
||||
|
brand_id, |
||||
|
stadium_id: id, |
||||
|
igsType, |
||||
|
key: tabLs.find(e=>e.selected)?.key |
||||
|
}); |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
page{ |
||||
|
background: #fff; |
||||
|
} |
||||
|
.sp-modify{ |
||||
|
margin: 40upx auto 0; |
||||
|
width: 618upx; |
||||
|
text-align: center; |
||||
|
border-radius: 10upx; |
||||
|
background: $mColor; |
||||
|
@include flcw(32upx, 88upx, #fff); |
||||
|
} |
||||
|
.sp-check{ |
||||
|
margin-top: 24upx; |
||||
|
margin-bottom: 60upx; |
||||
|
text-decoration: underline; |
||||
|
text-align: center; |
||||
|
@include flcw(24upx, 34upx, $mColor); |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,66 @@ |
|||||
|
<template> |
||||
|
<view class="auto-clean"> |
||||
|
<view class="ac-line"> |
||||
|
<view class="al-txt">凌晨自动清零</view> |
||||
|
<switch class="al-switch" color="#009777" :checked="autoClean" disabled @click="switchClick"></switch> |
||||
|
</view> |
||||
|
<view class="ac-desc"> |
||||
|
*不开启凌晨自动清零,则现场灯光按<text class="ad-txt">【现场散客人数】</text>去判断是否开启或关闭;<text class="ad-txt">修改人数会直接影响现场灯光开关!</text> |
||||
|
</view> |
||||
|
<view class="ac-desc"> |
||||
|
*开启凌晨自动清零,则现场灯光按<text class="ad-txt">【散客订单未离场数量】</text>去判断是否开启或关闭,<text class="ad-txt">修改人数不会影响现场灯光开关!但如有散客订单一直未扫码离场,可能会无法关灯,需要将未离场的散客订单设置为已离场后才可关闭灯光!</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { showModal } from "@/utils/util.js"; |
||||
|
export default { |
||||
|
props: { |
||||
|
autoClean: { |
||||
|
type: Boolean, |
||||
|
default: false |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
switchClick(){ |
||||
|
let { autoClean } = this; |
||||
|
let _contentTxt = autoClean ? '是否确认关闭凌晨自动清零?' : '是否确认开启凌晨自动清零?'; |
||||
|
showModal({ |
||||
|
content: _contentTxt, |
||||
|
showCancel: true, |
||||
|
success: e=> { |
||||
|
if(e.confirm){ |
||||
|
let _status = autoClean ? 0 : 1; |
||||
|
this.$emit('switch:change', _status); |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.auto-clean{ |
||||
|
padding: 30upx; |
||||
|
.ac-line{ |
||||
|
@include ctf; |
||||
|
.al-txt{ |
||||
|
@include flcw(32upx, 44upx, #1A1A1A, 500); |
||||
|
} |
||||
|
.al-switch{ |
||||
|
margin-left: 26upx; |
||||
|
transform: scale(.7); |
||||
|
} |
||||
|
} |
||||
|
.ac-desc{ |
||||
|
margin-top: 24upx; |
||||
|
@include flcw(24upx, 48upx, #9C9C9F); |
||||
|
.ad-txt{ |
||||
|
color: $mColor; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,73 @@ |
|||||
|
<template> |
||||
|
<scroll-view class="classify-tab" scroll-x> |
||||
|
<view class="ct-list"> |
||||
|
<view |
||||
|
v-for="(e, i) in tabs" |
||||
|
:key='i' |
||||
|
class="cl-item" |
||||
|
:class="{ 'cl-active': e.selected }" |
||||
|
@click="tabChange(i)" |
||||
|
> |
||||
|
<view class="ci-box">{{ e.label }}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
tabs: { |
||||
|
type: Array, |
||||
|
default: () => [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
tabChange(index){ |
||||
|
let { tabs } = this; |
||||
|
this.$emit('click:tab', tabs.map(e=>{ |
||||
|
let _obj = { ...e }; |
||||
|
if(tabs[index].key === e.key){ |
||||
|
_obj.selected = true; |
||||
|
}else{ |
||||
|
_obj.selected = false; |
||||
|
} |
||||
|
return _obj; |
||||
|
})); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" > |
||||
|
.classify-tab{ |
||||
|
height: 94upx; |
||||
|
border-bottom: 1px solid #D8D8D8; |
||||
|
.ct-list{ |
||||
|
padding: 0 40upx; |
||||
|
width: fit-content; |
||||
|
white-space: nowrap; |
||||
|
font-size: 0; |
||||
|
.cl-item{ |
||||
|
display: inline-block; |
||||
|
flex-shrink: 0; |
||||
|
flex-grow: 0; |
||||
|
border-bottom: 8upx solid transparent; |
||||
|
.ci-box{ |
||||
|
padding: 0 40upx; |
||||
|
text-align: center; |
||||
|
@include flcw(28upx, 80upx, #2D2D2D); |
||||
|
} |
||||
|
&+.cl-item{ |
||||
|
margin-left: 70upx; |
||||
|
} |
||||
|
&.cl-active{ |
||||
|
border-bottom-color: $mColor; |
||||
|
.ci-box{ |
||||
|
color: $mColor; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,62 @@ |
|||||
|
<template> |
||||
|
<view class="methods-bar"> |
||||
|
<view class="mb-top"> |
||||
|
<view class="mt-method">现场人数统计方式:{{ typeForTxt }}</view> |
||||
|
<view class="mt-date">{{ date || '' }}</view> |
||||
|
</view> |
||||
|
<view class="mb-tip">统计方式如需修改请前往后台“散客开关灯规则”处修改</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { formatDate } from "@/utils/util.js"; |
||||
|
|
||||
|
export default { |
||||
|
props: { |
||||
|
type: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
} |
||||
|
}, |
||||
|
data(){ |
||||
|
return { |
||||
|
date: '' |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
typeForTxt(){ |
||||
|
const { type } = this; |
||||
|
const tArr = ['按门店', '按门闸/门禁', '按场地分类']; |
||||
|
return tArr?.[type] ?? ''; |
||||
|
} |
||||
|
}, |
||||
|
mounted(){ |
||||
|
this.$nextTick(() => { |
||||
|
this.date = formatDate({ partition: '.' }); |
||||
|
}) |
||||
|
}, |
||||
|
methods: { |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.methods-bar{ |
||||
|
padding: 0 24upx; |
||||
|
.mb-top{ |
||||
|
@include ctf(space-between); |
||||
|
.mt-method{ |
||||
|
@include flcw(28upx, 40upx, #1A1A1A); |
||||
|
} |
||||
|
.mt-date{ |
||||
|
flex-shrink: 0; |
||||
|
@include flcw(28upx, 40upx, #1A1A1A); |
||||
|
} |
||||
|
} |
||||
|
.mb-tip{ |
||||
|
@include flcw(20upx, 28upx, #9C9C9F); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
</style> |
@ -0,0 +1,155 @@ |
|||||
|
<template> |
||||
|
<view class="ox-dark-mask" v-show="visible"> |
||||
|
<view class="nop-modifies-modal"> |
||||
|
<image class="nmm-close" src="../../../static/images/x_close.png" @click="hide"></image> |
||||
|
<view class="nmm-tit">修改现场散客人数</view> |
||||
|
<view class="nmm-info"> |
||||
|
<view class="ni-num">当前现场散客人数为:{{ nowNum || 0 }}</view> |
||||
|
<input class="ni-ipt" placeholder="请输入散客人数" v-model="changeNum" type="number" /> |
||||
|
<view class="ni-tip">修改现场人数可能会影响现场灯光开关,请谨慎操作!</view> |
||||
|
</view> |
||||
|
<view class="nmm-btns"> |
||||
|
<view @click="hide">取消</view> |
||||
|
<view @click="confirm">确认</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import API from "../../../js/api.js"; |
||||
|
import server from "../../../js/server.js"; |
||||
|
import { showNone, showLoad, hideLoad } from "@/utils/util.js"; |
||||
|
export default { |
||||
|
props: { |
||||
|
num: { default: 0 } |
||||
|
}, |
||||
|
data(){ |
||||
|
return { |
||||
|
visible: false, |
||||
|
nowNum: 0, // 现场人数 |
||||
|
brand_id: '', |
||||
|
stadium_id: '', |
||||
|
igsType: '', |
||||
|
key: '', // gate_id / venue_type_key |
||||
|
initOptions: {}, |
||||
|
changeNum: '', |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
confirm(){ |
||||
|
let { brand_id, stadium_id, changeNum, igsType, key } = this; |
||||
|
if(isNaN(changeNum))return showNone('请输入正确数量!'); |
||||
|
let _query = { brand_id, stadium_id, number: changeNum }; |
||||
|
let _keyName = igsType === 1 ? 'gate_id' : igsType === 2 ? 'venue_type_key' : ''; |
||||
|
if(_keyName)_query[_keyName] = key || ''; |
||||
|
this.setStadiumPresentNumber(_query) |
||||
|
}, |
||||
|
/** |
||||
|
* @param { String } brand_id 品牌id |
||||
|
* @param { String } stadium_id 场馆id |
||||
|
* @param { String } venue_type_key 场地分类KEY,igs_type=2时必传 |
||||
|
* @param { String } gate_id 门禁ID,igs_type=1时必传 |
||||
|
* @param { String } number 人数 |
||||
|
* */ |
||||
|
setStadiumPresentNumber(_query){ |
||||
|
showLoad(); |
||||
|
server.post({ |
||||
|
url: API.setStadiumPresentNumber, |
||||
|
data: _query, |
||||
|
isDefaultGet: false, |
||||
|
}) |
||||
|
.then(res=>{ |
||||
|
hideLoad(); |
||||
|
if(res.data.code == 0){ |
||||
|
showNone(res.data.message || '操作成功!'); |
||||
|
this.$emit('modify:success'); |
||||
|
this.initOptions?.success?.(); |
||||
|
}else{ |
||||
|
showNone(res.data.message || '操作失败!'); |
||||
|
} |
||||
|
this.hide(); |
||||
|
}) |
||||
|
.catch(hideLoad) |
||||
|
}, |
||||
|
initData(e){ |
||||
|
let { num, brand_id, stadium_id, igsType, key, ...opts } = e; |
||||
|
this.nowNum = num || 0; |
||||
|
this.brand_id = brand_id || ''; |
||||
|
this.stadium_id = stadium_id || ''; |
||||
|
this.igsType = igsType || ''; |
||||
|
this.key = key || ''; |
||||
|
this.initOptions = opts; |
||||
|
this.show(); |
||||
|
}, |
||||
|
show(){ |
||||
|
this.visible = true |
||||
|
}, |
||||
|
hide(){ |
||||
|
this.visible = false |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.ox-dark-mask{ |
||||
|
z-index: 10; |
||||
|
} |
||||
|
.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{ |
||||
|
text-align: center; |
||||
|
@include flcw(32upx, 44upx, #1A1A1A, 500) |
||||
|
} |
||||
|
.nmm-info{ |
||||
|
padding: 54upx 80upx 80upx; |
||||
|
.ni-num{ |
||||
|
@include tHide; |
||||
|
@include flcw(28upx, 48upx, #1A1A1A); |
||||
|
} |
||||
|
.ni-ipt{ |
||||
|
margin-top: 30upx; |
||||
|
padding: 0 20upx; |
||||
|
height: 88upx; |
||||
|
border-radius: 10upx; |
||||
|
border: 2upx solid #D8D8D8; |
||||
|
@include flcw(28upx, 40upx, #1A1A1A); |
||||
|
} |
||||
|
.ni-tip{ |
||||
|
margin-top: 26upx; |
||||
|
@include flcw(24upx, 34upx, #EA5061); |
||||
|
} |
||||
|
} |
||||
|
.nmm-btns{ |
||||
|
@include ctf(center); |
||||
|
>view{ |
||||
|
margin: 0 10upx; |
||||
|
width: 240upx; |
||||
|
text-align: center; |
||||
|
border-radius: 10upx; |
||||
|
border: 2upx solid $mColor; |
||||
|
@include flcw(32upx, 84upx, $mColor); |
||||
|
&+view{ |
||||
|
color: #fff; |
||||
|
background-color: $mColor; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,127 @@ |
|||||
|
<template> |
||||
|
<view class="not-leave-modal ox-dark-mask" v-show="visible"> |
||||
|
<view class="nop-modifies-modal"> |
||||
|
<image class="nmm-close" @click="hide" src="../../../static/images/x_close.png"></image> |
||||
|
<view class="nmm-tit">未离场订单</view> |
||||
|
<view class="nmm-line"> |
||||
|
<view class="ml-view">次卡未离场:{{ notLeaveInfo.person_number || 0 }}</view> |
||||
|
<view class="ml-view" @click="checkBtn(0)">查看</view> |
||||
|
</view> |
||||
|
<view class="nmm-line"> |
||||
|
<view class="ml-view">计时未离场:{{ notLeaveInfo.person_timing || 0 }}</view> |
||||
|
<view class="ml-view" @click="checkBtn(1)">查看</view> |
||||
|
</view> |
||||
|
<view class="nmm-line"> |
||||
|
<view class="ml-view">年月卡未离场:{{ notLeaveInfo.monthly_card || 0 }}</view> |
||||
|
<view class="ml-view" @click="checkBtn(0)">查看</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import API from "../../../js/api.js"; |
||||
|
import server from "../../../js/server.js"; |
||||
|
import { showNone, showLoad, hideLoad, routeTo } from "@/utils/util.js"; |
||||
|
export default { |
||||
|
data(){ |
||||
|
return { |
||||
|
visible: false, |
||||
|
notLeaveInfo: {} |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
show(){ |
||||
|
this.visible = true; |
||||
|
}, |
||||
|
hide(){ |
||||
|
this.visible = false; |
||||
|
}, |
||||
|
initData(e){ |
||||
|
let { igsType, key, stadium_id, brand_id } = e; |
||||
|
this.show(); |
||||
|
let _keyName = igsType === 1 ? 'gate_id' : igsType === 2 ? 'venue_type_key' : ''; |
||||
|
let _query = { brand_id, stadium_id }; |
||||
|
if(_keyName)_query[_keyName] = key ?? ''; |
||||
|
this.getSkNotLeavingNums(_query); |
||||
|
}, |
||||
|
/** |
||||
|
* http://api.ouxuan.net:61080/project/11/interface/api/13892 |
||||
|
* @param { String } brand_id 品牌id |
||||
|
* @param { String } stadium_id 场馆id |
||||
|
* @param { String } venue_type_key 场地分类KEY,igs_type=2时必传 |
||||
|
* @param { String } gate_id 门禁ID,igs_type=1时必传 |
||||
|
* */ |
||||
|
getSkNotLeavingNums(_query){ |
||||
|
showLoad(); |
||||
|
return server.get({ |
||||
|
url: API.skNotLeavingNums, |
||||
|
data: _query, |
||||
|
failMsg: '加载信息失败!' |
||||
|
}) |
||||
|
.then(res=>{ |
||||
|
hideLoad(); |
||||
|
this.notLeaveInfo = res || {}; |
||||
|
}) |
||||
|
.catch(err=>{ |
||||
|
hideLoad(); |
||||
|
console.warn('site people not leave modal getSkNotLeavingNums err', err); |
||||
|
}) |
||||
|
}, |
||||
|
checkBtn(type){ |
||||
|
if(type == 0)return routeTo(`/pages/write_off/search_result/search_result`, 'nT'); |
||||
|
if(type == 1)return routeTo(`/pages/order_list/order_list?order_type=1`, 'nT'); |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.not-leave-modal{ |
||||
|
z-index: 10; |
||||
|
.nop-modifies-modal{ |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: 50%; |
||||
|
transform: translate(-50%, -50%); |
||||
|
padding: 80upx 80upx 0upx; |
||||
|
width: 620upx; |
||||
|
height: 542upx; |
||||
|
background-color: #fff; |
||||
|
border-radius: 10upx; |
||||
|
} |
||||
|
.nmm-close{ |
||||
|
position: absolute; |
||||
|
right: 30upx; |
||||
|
top: 30upx; |
||||
|
width: 34upx; |
||||
|
height: 34upx; |
||||
|
} |
||||
|
.nmm-tit{ |
||||
|
text-align: center; |
||||
|
@include flcw(32upx, 44upx, #1A1A1A, 500) |
||||
|
} |
||||
|
.nmm-line{ |
||||
|
margin-top: 40upx; |
||||
|
@include ctf(space-between); |
||||
|
.ml-view{ |
||||
|
&:first-child{ |
||||
|
@include flcw(28rpx, 48rpx, #1A1A1A); |
||||
|
@include tHide; |
||||
|
} |
||||
|
&:nth-child(2){ |
||||
|
margin-left: 10upx; |
||||
|
flex-shrink: 0; |
||||
|
width: 156rpx; |
||||
|
height: 68rpx; |
||||
|
text-align: center; |
||||
|
border-radius: 10rpx; |
||||
|
border: 2rpx solid $mColor; |
||||
|
@include flcw(32rpx, 64rpx, $mColor); |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
</style> |
@ -0,0 +1,67 @@ |
|||||
|
<template> |
||||
|
<view class="number-show"> |
||||
|
<view class="ns-title">现场散客人数</view> |
||||
|
<view class="ns-frame"> |
||||
|
<image class="nf-bg" mode="aspectFit" src="../../../static/images/countdown_bg.png"></image> |
||||
|
<view class="nf-txt"> |
||||
|
<view class="nt-num">{{ num || 0 }}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
num: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.number-show{ |
||||
|
padding-top: 40upx; |
||||
|
.ns-title{ |
||||
|
text-align: center; |
||||
|
@include flcw(32upx, 44upx, #1A1A1A, 500); |
||||
|
} |
||||
|
.ns-frame{ |
||||
|
position: relative; |
||||
|
margin: 40upx auto; |
||||
|
width: 272upx; |
||||
|
height: 272upx; |
||||
|
.nf-bg{ |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: 50%; |
||||
|
margin-left: -75%; |
||||
|
margin-top: -75%; |
||||
|
width: 150%; |
||||
|
height: 150%; |
||||
|
animation: Rotate 6s linear infinite; |
||||
|
} |
||||
|
@keyframes Rotate{ |
||||
|
0% {transform: rotate(360deg);} |
||||
|
50% {transform: rotate(180deg);} |
||||
|
100% {transform: rotate(0deg);} |
||||
|
} |
||||
|
.nf-txt{ |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: 50%; |
||||
|
transform: translate(-50%, -50%); |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
z-index: 2; |
||||
|
@include ctf(center); |
||||
|
.nt-num{ |
||||
|
@include flcw(70upx, 100upx, $mColor, 500); |
||||
|
@include tHide; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,97 @@ |
|||||
|
<template> |
||||
|
<view class="stadium-select"> |
||||
|
<picker :range="stadiumLs" range-key="name" @change="stadiumChange"> |
||||
|
<view class="ss-frame"> |
||||
|
<input class="sf-ipt" placeholder="请选择店铺" :value="curStadium.name" disabled /> |
||||
|
<image class="sf-img" mode="aspectFit" src="../../../static/images/arrow_c33.png"></image> |
||||
|
</view> |
||||
|
</picker> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import API from "../../../js/api.js"; |
||||
|
import server from "../../../js/server.js"; |
||||
|
import { showLoad, hideLoad, showNone } from "@/utils/util.js"; |
||||
|
export default { |
||||
|
data(){ |
||||
|
return { |
||||
|
stadiumLs: [], |
||||
|
curStadium: {} |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
stadiumChange(e){ |
||||
|
let { value } = e?.detail; |
||||
|
let { stadiumLs } = this; |
||||
|
this.curStadium = stadiumLs?.[value] || {}; |
||||
|
this.$emit('change:stadium', this.curStadium); |
||||
|
}, |
||||
|
async initStadium(brand_id){ |
||||
|
try{ |
||||
|
showLoad(); |
||||
|
let _ls = await this.getStadiumLs({ brand_id }); |
||||
|
// _ls = _ls.filter(e=>{ |
||||
|
// return [167, 156, 151].includes(e.id); |
||||
|
// }) |
||||
|
this.stadiumLs = _ls || []; |
||||
|
hideLoad(); |
||||
|
if(_ls.length){ |
||||
|
this.curStadium = _ls[0]; |
||||
|
return _ls[0]; |
||||
|
}else{ |
||||
|
showNone('暂无店铺信息!'); |
||||
|
} |
||||
|
}catch(err){ |
||||
|
hideLoad(); |
||||
|
console.warn('stadium select initStadium err', err); |
||||
|
} |
||||
|
}, |
||||
|
getStadiumLs({ |
||||
|
page=1, |
||||
|
page_size=9999, |
||||
|
brand_id='', |
||||
|
}){ |
||||
|
|
||||
|
return server.get({ |
||||
|
url: API.stadiumList, |
||||
|
data: { |
||||
|
page, |
||||
|
page_size, |
||||
|
brand_id, |
||||
|
}, |
||||
|
failMsg: '获取店铺列表失败!' |
||||
|
}) |
||||
|
.then(res=>{ |
||||
|
let _list = res.list || []; |
||||
|
return _list |
||||
|
}) |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.stadium-select { |
||||
|
height: 144upx; |
||||
|
@include ctf(center); |
||||
|
.ss-frame{ |
||||
|
padding: 0 20upx; |
||||
|
width: 702upx; |
||||
|
height: 92upx; |
||||
|
border-radius: 10upx; |
||||
|
background-color: #F2F2F7; |
||||
|
@include ctf(space-between); |
||||
|
.sf-ipt{ |
||||
|
flex-grow: 1; |
||||
|
@include flcw(28upx, 40upx, #1A1A1A); |
||||
|
} |
||||
|
.sf-img{ |
||||
|
flex-shrink: 0; |
||||
|
margin-left: 20upx; |
||||
|
width: 28upx; |
||||
|
height: 28upx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
After Width: 24 | Height: 24 | Size: 599 B |
After Width: 700 | Height: 700 | Size: 33 KiB |
After Width: 34 | Height: 34 | Size: 233 B |
Write
Preview
Loading…
Cancel
Save
Reference in new issue