You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
9.3 KiB
287 lines
9.3 KiB
<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({
|
|
brand_id: options?.brand_id ?? '',
|
|
stadium_id: options?.stadium_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>
|