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.
 
 
 
 
 

264 lines
9.8 KiB

<template>
<view class="write-off-index">
<head-bar
:range="stadiumList" range-key="name" @change="stadiumChange"
placeholder="请选择场馆" :value="curStadium.name"
></head-bar>
<view class="woi-section">
<view class="ws-ipt-box">
<input class="wib-ipt" type="text" placeholder="请输入券码" v-model="iptCode" />
<image @click="scanCode" class="wib-img" mode="aspectFit" src="/subpackage/verification/static/images/scan.png"></image>
</view>
<view class="ws-txt">可输入订场、次卡、年月卡、赛事、商城到店领取商品的验证码/券码进行核销,或点扫码图标进入扫描界面扫码核销。</view>
<view class="ws-btn" @click="confirmBtn">确认</view>
</view>
<view class="woi-btns">
<view class="wb-items" @click="toAbnormal">
<image class="wi-icon" mode="aspectFit" src="/subpackage/verification/static/images/tab0.png"></image>
<view class="wi-txt">进场人数异常</view>
</view>
<view class="wb-items" @click="toSitePeople">
<image class="wi-icon" mode="aspectFit" src="/subpackage/verification/static/images/tab1.png"></image>
<view class="wi-txt">现场人数</view>
</view>
<view class="wb-items" @click="toRecord">
<image class="wi-icon" mode="aspectFit" src="/subpackage/verification/static/images/tab2.png"></image>
<view class="wi-txt">核销记录</view>
</view>
</view>
</view>
</template>
<script>
import API from "../js/api.js";
import server from "../js/server.js";
import { showLoad, hideLoad, showModal, showNone, debounce, changeLowerCase, $_emit, routeTo, jsonStr } from "@/utils/util.js";
import { WRITE_OFF_ORDER_INFO } from '@/js/once_name';
import headBar from "../components/head_bar.vue";
export default {
components: { headBar },
data(){
return{
brand_id: '',
stadiumList: [],
curStadium: {},
iptCode: '',
}
},
onLoad(options){
let _brand_id = options?.brand_id || '';
this.brand_id = _brand_id;
this.getStadiumLs({ brand_id: _brand_id });
},
methods: {
// 现场人数
toSitePeople(){
let { brand_id } = this;
routeTo(`/subpackage/verification/pages/site_people/index?brand_id=${brand_id}`, 'nT');
},
// 人数异常
toAbnormal(){
let { brand_id } = this;
routeTo(`/subpackage/blacklist/pages/abnormal_list/abnormal_list?brand_id=${brand_id}`, 'nT');
},
toRecord(){
let { brand_id } = this;
routeTo(`/subpackage/verification/pages/record?brand_id=${brand_id}`, 'nT');
},
confirmBtn: debounce(function(){
let { iptCode } = this;
let { curStadium } = this;
if(!curStadium?.id)return showModal({ content: '请选择场馆!' });
this.verifyOrder({
brand_id: curStadium?.brand_id ?? '',
stadium_id: curStadium?.id ?? '',
verify_code: iptCode ?? '',
})
}, 300, true),
scanCode: debounce(function(){
let { curStadium } = this;
if(!curStadium?.id)return showModal({ content: '请选择场馆!' });
uni.scanCode({
onlyFromCamera: true,
scanType: 'qrCode',
success: res=> {
if(changeLowerCase(res.scanType) !== 'qr_code')return showNone('不支持此类型!');
let { curStadium } = this;
this.verifyOrder({
brand_id: curStadium?.brand_id ?? '',
stadium_id: curStadium?.id ?? '',
decrypt_text: res?.result ?? '',
})
},
fail: function(err) {
showNone('扫码失败!');
console.warn('扫码失败--->', err);
}
})
}, 300, true),
stadiumChange(e){
let { stadiumList } = this;
this.curStadium = stadiumList[e.detail.value];
},
// 获取门店列表
getStadiumLs({ brand_id }){
showLoad();
return server.post({
url: API.stadiumList,
data: { page_size: 9999, page: 1, brand_id },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
let _ls = _data?.data?.list || [];
this.stadiumList = _ls;
return _ls;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '加载店铺失败!'
})
console.warn('verification index getStadiumLs err --->', err);
// return Promise.reject(err);
})
},
/**
* 订单预检验
* @param {String} brand_id
* @param {String} stadium_id
* @param {String} verify_code 订单验证码
* @param {String} decrypt_text 二维码数据
* */
verifyOrder({ brand_id, stadium_id, verify_code = '', decrypt_text = '' }){
let _vType = verify_code ? 'verify_code' : decrypt_text ? 'decrypt_text' : '';
showLoad();
return server.post({
url: API.enterVerifyOrder,
data: { brand_id, stadium_id, verify_code, decrypt_text },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
let _orderData = _data?.data || {};
// 商城订单
if(_orderData?.extension?.verify_order_type === 'product_order'){
$_emit(WRITE_OFF_MALL_ORDER_INFO, { data: _orderData });
routeTo(`/pages/write_off/ym_confirm/ym_confirm?type=${_vType}`, 'nT');
return
}
// 年月卡
if(_orderData?.extension?.verify_order_type === 'monthly_card'){
$_emit(WRITE_OFF_ORDER_INFO, { data: _orderData, query: { brand_id, stadium_id, verify_code, decrypt_text } });
routeTo(`/pages/write_off/ym_confirm/ym_confirm?type=${_vType}`, 'nT');
return
}
// 赛事
if(_orderData?.extension?.verify_order_type === 'match_order'){
$_emit(WRITE_OFF_ORDER_INFO, {..._orderData});
routeTo(`/pages/write_off/events_order/events_order?type=${_vType}`, 'nT');
return
}
// 场次、次卡
$_emit(WRITE_OFF_ORDER_INFO, { ..._orderData });
routeTo(`/pages/write_off/confirm_order/confirm_order?type=${_vType}`, 'nT');
}else if(_data.code === 805){
routeTo(`/subpackage/verification/pages/null?tip=${jsonStr(_data?.message ?? '')}`, 'nT');
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '核销查询失败!'
})
console.warn('verification index verifyOrder err --->', err);
// return Promise.reject(err);
})
},
}
}
</script>
<style lang="scss">
.write-off-index{
.woi-section{
margin-top: 24upx;
padding-top: 26upx;
padding-bottom: 80upx;
background: #fff;
.ws-ipt-box{
margin: 0 auto;
padding: 0 20upx;
width: 702upx;
height: 92upx;
background: #F2F2F7;
border-radius: 10upx;
@include ctf;
.wib-ipt{
flex-grow: 1;
height: 100%;
@include flcw(28upx, 40upx, #333);
}
.wib-img{
flex-shrink: 0;
margin-left: 20upx;
width: 60upx;
height: 60upx;
}
}
.ws-txt{
margin-top: 24upx;
padding: 0 32upx;
@include flcw(28upx, 52upx, #333);
}
.ws-btn{
margin: 22upx auto 0;
text-align: center;
width: 240upx;
border-radius: 10upx;
background: $mColor;
@include flcw(32upx, 88upx, #fff);
}
}
.woi-btns{
margin-top: 24upx;
padding: 38upx 24upx;
background: #fff;
@include ctf(space-between);
.wb-items{
padding: 18upx 0;
flex-grow: 0;
flex-shrink: 0;
width: 226upx;
.wi-icon{
display: block;
margin: 0 auto;
width: 64upx;
height: 64upx;
}
.wi-txt{
margin-top: 24upx;
text-align: center;
@include flcw(28upx, 40upx, #333);
@include tHide;
}
}
}
}
</style>