0fef3f34 by 杨炀

Merge commit 'e7e88867' into dev

2 parents 7ad8a813 e7e88867
......@@ -105,5 +105,14 @@ export function delByCard(card) {
method: 'delete'
})
}
export function addPickup(data) {
return request({
url: `/league/pickup`,
method: 'post',
data
})
}
......
......@@ -576,6 +576,18 @@ export const constantRoutes = [
component: () => import('@/viewsPc/seat/people-manage'),
meta: { title: '观影人管理' }
},
{
path: 'payTicketOk',
component: () => import('@/viewsPc/seat/payticketOk.vue'),
name: 'payTicketOk',
meta: { title: '支付成功'}
},
{
path: 'payTicketLoser',
component: () => import('@/viewsPc/seat/payticketLoser.vue'),
name: 'payTicketLoser',
meta: { title: '支付失败'}
},
]
}
]
......@@ -595,6 +607,7 @@ export const constantRoutes = [
name: 'payOk',
meta: { title: '支付成功'}
},
{
path: 'commitDone/:orderId',
component: () => import('@/viewsPc/match/commitDone'),
......
......@@ -114,7 +114,7 @@ function popRemark(type) {
|| (form.value.isFoodView == 0 && type == '3')
|| (form.value.isMealView == 0 && type == '4')
|| (form.value.isPhotoView == 0 && type == '5')
|| (type == '0')
// || (type == '0')
) {
building()
return
......
<template>
<el-dialog
v-model="show" :close-on-click-modal="false" :title="title" append-to-body center class="pcloginpop"
close-icon="CircleClose" destroy-on-close
width="900px"
>
<div class="boxInvitation pd20" >
<div v-if="!showR" >
<el-form ref="iformRef" :label-width="language==0?'120px':'240px'" :model="form" :rules="rules"
label-position="right">
<el-form-item :label="language==0?'服务类型':'Service Type '" prop="type" required style="margin-bottom: 0px">
<el-checkbox-group v-model="form.type">
<el-checkbox label="1">{{ language == 0 ? '接机' : 'airport pickup' }}</el-checkbox>
<el-checkbox label="2">{{ language == 0 ? '送机' : 'airport drop-off' }}</el-checkbox>
</el-checkbox-group>
<!-- <span style="color: red;margin-left: 10px">{{language==0?'仅限境外及港澳台人员填写':'For overseas and Hong Kong, Macao, and Taiwan personnel only.'}}</span>-->
</el-form-item>
<div style="padding-left: 48px;color:red;margin-bottom: 18px">
{{language==0?'仅限境外及港澳台人员填写':'For overseas and Hong Kong, Macao, and Taiwan personnel only.'}}
</div>
<div v-if="form.type?.some(v=>v==1)">
<h3 class="leftboderTT">{{ language == 0 ? '接机信息' : 'Pick-up information' }}</h3>
<el-form-item :label="language==0?'抵达人员身份':'Role of Person-Arrival'" prop="pickUpBo.standing" required>
<el-checkbox-group v-model="form.pickUpBo.standing">
<el-checkbox :label="language==0?'运动员':'Athlete'" name="1"/>
<el-checkbox :label="language==0?'随队人员':'Accompanying Person'" name="2"/>
<el-checkbox :label="language==0?'官员':'Official'" name="3"/>
<el-checkbox :label="language==0?'其他':'Others'" name="4"/>
</el-checkbox-group>
</el-form-item>
<el-form-item :label="language==0?'国家/地区':'Country/Region'" prop="pickUpBo.nationalitys" required>
<el-select v-model="form.pickUpBo.nationalitys" filterable multiple style="width: 100%;">
<el-option v-for="item in countrys"
:key="item.id"
:label="language==0?item.name:item.enName"
:value="language==0?item.name :item.enName"/>
</el-select>
</el-form-item>
<el-form-item :label="language==0?'联系人':'Contact Person'" prop="pickUpBo.name" required>
<el-input v-model="form.pickUpBo.name"/>
</el-form-item>
<el-form-item :label="language==0?'联系电话':'Contact Phone Number'" prop="pickUpBo.phone" required>
<el-input v-model="form.pickUpBo.phone"/>
</el-form-item>
<el-form-item :label="language==0?'接机人数':'Number of People'" prop="pickUpBo.counts" required>
<el-input-number v-model="form.pickUpBo.counts"/>
<span style="color: red;margin-left: 10px">{{language==0?'(填写的人数需是乘坐同一航班/车次)':'The number of people to be filled in must be on the same flight/train'}}</span>
</el-form-item>
<!-- <div style="padding-left: 48px;color: red;margin-bottom: 18px">-->
<!-- {{language==0?'填写的人数需是乘坐同一航班/车次':'The number of people to be filled in must be on the same flight/train'}}-->
<!-- </div>-->
<el-form-item :label="language==0?'抵达日期':'Flight/Train Arrival Date'" prop="pickUpBo.arrivalDate"
required>
<el-date-picker
v-model="form.pickUpBo.arrivalDate" format="YYYY-MM-DD"
placeholder="YYYY-MM-DD"
style="width: 100%;" type="date" value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item :label="language==0?'抵达时间':'Flight/Train Arrival Time'" prop="pickUpBo.arrivaTime"
required>
<!-- <el-date-picker-->
<!-- v-model="form.pickUpBo.arrivaTime"-->
<!-- format="YYYY-MM-DD" placeholder="YYYY-MM-DD"-->
<!-- style="width: 100%;" type="date" value-format="YYYY-MM-DD"-->
<!-- />-->
<el-time-picker v-model="form.pickUpBo.arrivaTime" placeholder="HH:mm:ss" value-format="HH:mm:ss" format="HH:mm:ss" style="width: 100%;"/>
</el-form-item>
<el-form-item :label="language==0?'航班/车次':'Flight/Train Number'" prop="pickUpBo.flight" required>
<el-input v-model="form.pickUpBo.flight"/>
</el-form-item>
<el-form-item :label="language==0?'机场/火车站':'Airport/Train Station'" prop="pickUpBo.stationName"
required>
<el-input v-model="form.pickUpBo.stationName"/>
</el-form-item>
<el-form-item :label="language==0?'航站楼':'Air Terminal'" prop="pickUpBo.terminal" required>
<el-input v-model="form.pickUpBo.terminal"/>
</el-form-item>
<el-form-item :label="language==0?'送达酒店':'Destination Hotel'" prop="pickUpBo.hotle" required>
<el-input v-model="form.pickUpBo.hotle"/>
</el-form-item>
<el-form-item :label="language==0?'行程单':'Round-Trip Itinerary'" prop="pickUpBo.itinerary" required>
<image-upload v-model="form.pickUpBo.itinerary" :button-text="language==0?'上传':'Upload'"
:is-show-tip="false"
:limit="1"/>
</el-form-item>
</div>
<div v-if="form.type?.some(v=>v==2)">
<!-- <el-form-item :label="language == 0 ? '送机信息' : 'Delivery information' ">-->
<!-- </el-form-item>-->
<h3 class="leftboderTT">{{language == 0 ? '送机信息' : 'Delivery information'}}</h3>
<el-form-item
:label="language==0?'离会人员身份':'Role of Person-Departure'"
prop="downOffBo.standing" required>
<!-- <el-input v-model="form.downOffBo.standing"/>-->
<el-checkbox-group v-model="form.downOffBo.standing">
<el-checkbox :label="language==0?'运动员':'Athlete'" name="1"/>
<el-checkbox :label="language==0?'随队人员':'Accompanying Person'" name="2"/>
<el-checkbox :label="language==0?'官员':'Official'" name="3"/>
<el-checkbox :label="language==0?'其他':'Others'" name="4"/>
</el-checkbox-group>
</el-form-item>
<el-form-item :label="language==0?'国家/地区':'Country/Region'" prop="downOffBo.nationalitys" required >
<el-select v-model="form.downOffBo.nationalitys" filterable multiple style="width: 100%;">
<el-option v-for="item in countrys"
:key="item.id"
:label="language==0?item.name:item.enName"
:value="language==0?item.name:item.enName"/>
</el-select>
</el-form-item>
<el-form-item :label="language==0?'联系人':'Contact Person'" prop="downOffBo.name" required>
<el-input v-model="form.downOffBo.name"/>
</el-form-item>
<el-form-item :label="language==0?'联系电话':'Contact Phone Number'" prop="downOffBo.phone" required>
<el-input v-model="form.downOffBo.phone"/>
</el-form-item>
<el-form-item :label="language==0?'送机人数':'Number of People'" prop="downOffBo.counts" required>
<el-input-number v-model="form.downOffBo.counts"/>
<span style="color: red;margin-left: 10px">{{language==0?'(填写的人数需是乘坐同一航班/车次)':'The number of people to be filled in must be on the same flight/train'}}</span>
</el-form-item>
<!-- <div style="padding-left: 48px;color: red;margin-bottom: 18px">-->
<!-- {{language==0?'填写的人数需是乘坐同一航班/车次':'The number of people to be filled in must be on the same flight/train'}}-->
<!-- </div>-->
<el-form-item :label="language==0?'离开日期':'Departure Date from Hotel'" prop="downOffBo.arrivalDate"
required>
<el-date-picker
v-model="form.downOffBo.arrivalDate" format="YYYY-MM-DD"
placeholder="YYYY-MM-DD"
style="width: 100%;" type="date" value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item :label="language==0?'离开时间':'Departure Time from Hotel'" prop="downOffBo.arrivaTime" required>
<!-- <el-date-picker-->
<!-- v-model="form.downOffBo.rrivaTime"-->
<!-- format="YYYY-MM-DD" placeholder="YYYY-MM-DD"-->
<!-- style="width: 100%;" type="date" value-format="YYYY-MM-DD"-->
<!-- />-->
<el-time-picker v-model="form.downOffBo.arrivaTime" placeholder="HH:mm:ss" value-format="HH:mm:ss" format="HH:mm:ss" style="width: 100%;"/>
</el-form-item>
<el-form-item :label="language==0?'航班/车次':'Flight/Train Number'" prop="downOffBo.flight" required>
<el-input v-model="form.downOffBo.flight"/>
</el-form-item>
<el-form-item :label="language==0?'机场/火车站':'Airport/Train Station'" prop="downOffBo.stationName"
required>
<el-input v-model="form.downOffBo.stationName"/>
</el-form-item>
<el-form-item :label="language==0?'航站楼':'Air Terminal'" prop="downOffBo.terminal" required>
<el-input v-model="form.downOffBo.terminal"/>
</el-form-item>
<el-form-item :label="language==0?'出发酒店':'Departure Hotel'" prop="downOffBo.hotle" required>
<el-input v-model="form.downOffBo.hotle"/>
</el-form-item>
<el-form-item :label="language==0?'行程单':'Round-Trip Itinerary'" prop="downOffBo.itinerary" required>
<image-upload v-model="form.downOffBo.itinerary" :button-text="language==0?'上传':'Upload'"
:is-show-tip="false"
:limit="1"/>
</el-form-item>
</div>
<div class="text-center">
<el-button class="btn-lineG" round size="large" type="primary" @click="submitForm()">
{{ language == 0 ? '提交' : 'submit' }}
</el-button>
</div>
</el-form>
</div>
<div >
<div v-if="showR" class="text-center pd20">
<img class="mauto" src="@/assets/dance/ok.png"/>
<h2 class="text-center">{{ language == 0 ? '境外及港澳台接送信息已提交' : 'Request Form for Overseas, HKT, Mau, China and TPE Athletes Arrival and Departure' }}</h2>
<h4 v-if="language == 0" class="text-center">
我们已收到您的申请
</h4>
<h4 v-else>
Your application has been received
<!-- <br/>-->
<!-- Please register in Wuxi on July 14.-->
</h4>
</div>
</div>
</div>
</el-dialog>
</template>
<script setup>
import {useStorage} from "@vueuse/core/index";
import {getCurrentInstance, watch, ref} from "vue";
import {nextTick} from "@vue/runtime-core";
import {ElMessage, ElMessageBox} from "element-plus";
import {addInvitation, countryList} from "@/apiPc/match";
import ImageUpload from "@/components/ImageUpload";
import {masterClassList, getByCard, submitMasterApply, getMasterApply, delByCard,addPickup} from "@/apiPc/common";
const {proxy} = getCurrentInstance()
const language = useStorage('language', 0)
const form = ref({
pickUpBo: {
serviceType:1
},
downOffBo: {
serviceType:2
},
type: ['1']
})
const show = ref(false)
const showR = ref(false)
const title = ref('')
const activeStep = ref(0)
const countrys = ref([])
const courseList = ref([])
const cptId = ref('')
const rules = ref(
{
type: [{required: true, trigger: 'change', message: language.value == 0 ? '请选择' : 'Please choose'},],
'pickUpBo.standing': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'pickUpBo.nationalitys': [{
required: true,
trigger: 'blur',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'pickUpBo.name': [{required: true, trigger: 'change', message: language.value == 0 ? '请输入' : 'Please enter'},],
'pickUpBo.phone': [{required: true, trigger: 'change', message: language.value == 0 ? '请输入' : 'Please enter'},],
'pickUpBo.counts': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'pickUpBo.arrivalDate': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'pickUpBo.arrivaTime': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'pickUpBo.flight': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'pickUpBo.stationName': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'pickUpBo.terminal': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'pickUpBo.hotle': [{required: true, trigger: 'change', message: language.value == 0 ? '请输入' : 'Please enter'},],
'pickUpBo.itinerary': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.nationalitys': [{
required: true,
trigger: 'blur',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.standing': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.name': [{required: true, trigger: 'change', message: language.value == 0 ? '请输入' : 'Please enter'},],
'downOffBo.phone': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'downOffBo.counts': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.arrivalDate': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.arrivaTime': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
'downOffBo.flight': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'downOffBo.stationName': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'downOffBo.terminal': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'downOffBo.hotle': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请输入' : 'Please enter'
},],
'downOffBo.itinerary': [{
required: true,
trigger: 'change',
message: language.value == 0 ? '请选择' : 'Please choose'
},],
})
const open = (params) => {
show.value = true
showR.value=false
form.value={
pickUpBo: {
serviceType:1
},
downOffBo: {
serviceType:2
},
type: ['1'],
}
title.value = language.value == 0 ? '境外及港澳台接送信息登记' : 'Request Form for Overseas, HKT, Mau, China and TPE Athletes Arrival and Departure'
cptId.value = params.cptId
getCourse()
// proxy.$refs['iformRef']
}
defineExpose({open})
watch(show, (value) => {
if (!value) {
form.value = {
sex: '0'
}
if (language.value == 0) {
form.value.countryId = 240
}
}
})
function getCourse() {
masterClassList({cptId: cptId.value}).then(res => {
courseList.value = res.data
})
}
function setActive(n) {
activeStep.value = n
}
function submitForm() {
proxy.$refs['iformRef'].validate(async valid => {
if (valid) {
form.value.pickUpBo.cptId=cptId.value
form.value.downOffBo.cptId=cptId.value
// form.value.pickUpBo.serviceType=1
// form.value.downOffBo.serviceType=2
console.log(form.value)
let forms=JSON.parse(JSON.stringify(form.value))
forms.pickUpBo.nationalitys=forms.pickUpBo.nationalitys?.join(',')
forms.pickUpBo.standing=forms.pickUpBo.standing?.join(',')
forms.downOffBo.nationalitys=forms.downOffBo.nationalitys?.join(',')
forms.downOffBo.standing=forms.downOffBo.standing?.join(',')
forms.type=null
if(!form.value.type.includes('1')) forms.pickUpBo={}
if(!form.value.type.includes('2')) forms.downOffBo={}
const res=await addPickup(forms)
if (res.code==200) {
proxy.$modal.msgSuccess('操作成功!')
showR.value=true
// show.value=false
}
} else {
proxy.$modal.msgError(language.value==0?'请完善信息!':'Please complete the information!')
}
}
)
}
// function checkApplyCourse(n) {
// getMasterApply({card: form.value.passportNo}).then(res => {
// if (res.data?.length > 0) {
// form.value.courseId = []
// for (var n of res.data) {
// form.value.courseId.push(n.itemId)
// }
// ElMessageBox.confirm(
// language.value == 0 ? '您已提交过信息,是否更新?' : 'You have submitted the information, do you want to update?',
// language.value == 0 ? '提示' : 'Tips', {
// confirmButtonText: language.value == 0 ? '是' : 'Confirm',
// cancelButtonText: language.value == 0 ? '否' : 'Cancel',
// type: 'warning'
// }).then(() => {
// //删除原记录
// delByCard(form.value.passportNo).then(res => {
// form.value.courseId = []
// disChoose.value = false
// to2()
// })
// }).catch(() => {
// disChoose.value = true
// to2()
// })
// } else {
// to2()
// }
// })
//
// }
function to2() {
proxy.$refs.iformRef.validate(valid => {
if (form.value.email.indexOf('@') == -1) {
if (language.value == 0) {
ElMessage.warning('请填写正确的邮箱')
} else {
ElMessage.warning('Please fill in the correct email')
}
return
}
if (valid) {
setActive(2)
}
})
}
getCountryList()
function getCountryList() {
countryList().then(res => {
countrys.value = res.data
})
}
</script>
<style scoped>
.xzRich {
line-height: 2;
font-size: 14px;
}
.boxInvitation {
width: 90%;
margin: auto
}
h4 {
font-size: 15px;
line-height: 1.6;
}
.leftboderTT {
font-size: 16px;
line-height: 1;
text-transform: uppercase;
position: relative;
padding-left: 22px;
font-weight: 400;
margin-bottom: 10px;
}
</style>
<template>
<div>
<index-Ch v-if="language ==0" @pop="openMaster"/>
<index-En v-else @pop="openMaster"/>
<index-Ch v-if="language ==0" @pop="openMaster" @pickup="openPickup"/>
<index-En v-else @pop="openMaster" @pickup="openPickup"/>
<div v-if="showgg" class="fixed_gg">
<!--天气-->
<el-icon class="cclose" @click.stop="showgg=false"><circle-close /></el-icon>
......@@ -61,6 +61,7 @@
</div>
<dialog-master-class ref="masterClassRef"/>
<pickup ref="pickupRef"></pickup>
</div>
</template>
......@@ -70,6 +71,7 @@ import IndexCh from '/src/viewsPc/index'
import IndexEn from '/src/viewsPc/index_en'
import WeatherIcon from '@/viewsPc/components/weatherIcon'
import DialogMasterClass from '@/viewsPc/components/masterClass'
import pickup from '@/viewsPc/components/pickup'
import {useStorage} from "@vueuse/core/index";
import {ref} from "vue";
import {getWeather} from "@/apiPc/webSite";
......@@ -103,6 +105,15 @@ const openMaster = (params) => {
}
proxy.$refs['masterClassRef'].open(obj)
}
const openPickup= (params) => {
console.log(params)
const obj = {
title:'接送机服务',
cptId:params.cptId
}
proxy.$refs['pickupRef'].open(obj)
}
</script>
<style scoped lang="scss">
......
......@@ -95,6 +95,11 @@
</a>
<!-- <el-button type="primary" @click="popMaster">青少年公益课</el-button>-->
<a class="zn-btn ml20 btn-q" @click="popMaster">青少年公益课报名</a>
<div>
<a class="ding" @click="handlePickup">接/送机服务</a>
</div>
</div>
</el-col>
<el-col :sm="24" :lg="14">
......@@ -377,7 +382,7 @@ const navigationPic = ref({
})
const router = useRouter()
const {proxy} = getCurrentInstance()
const emit = defineEmits(['pop'])
const emit = defineEmits(['pop','pickup'])
const time = ref(0)
const personList = ref([
{ name: 'Wolfgang Eliasch', pp: '拉丁舞裁判长 奥地利', src: '/img/1.png' },
......@@ -500,6 +505,13 @@ const popMaster = () => {
emit('pop',params)
}
const handlePickup=()=>{
const params={
cptId :matchData.value.id
}
emit('pickup',params)
}
</script>
<style scoped lang="scss">
......@@ -970,4 +982,17 @@ const popMaster = () => {
background: linear-gradient(-90deg, #8623FC, #453DEA) !important;
}
.ding{
position: fixed;
right: 0px;
z-index:99;
top: 40%;
background: linear-gradient(-90deg, #8623FC, #453DEA) !important;
box-shadow: none;
color: #fff;
border-radius: 10px;
padding: 20px;
width: 192px;
text-align: center;
}
</style>
......
......@@ -88,11 +88,17 @@
<div style="margin-bottom: 30px">
<a class="zn-btn" style="font-size: 15px" @click="goGuide">GUIDELINE<el-icon><download /></el-icon>
</a>
<a class="zn-btn ml20 btn-q" style="font-size: 15px" @click="popMaster">Junior &Youth Camp REGISTER<el-icon><Edit /></el-icon>
<a class="zn-btn ml20 btn-q" style="font-size: 15px;margin-right: 20px" @click="popMaster">Junior &Youth Camp REGISTER<el-icon><Edit /></el-icon>
</a>
<div>
<a class=" ding" style="font-size: 15px;margin-top: 10px" @click="handlePickup">Pick-up/drop-off service
</a>
</div>
</div>
</div>
</el-col>
<el-col :sm="24" :lg="14">
<HomeQuick :match-id="matchData?.id"/>
......@@ -508,6 +514,13 @@ const popMaster = () => {
}
emit('pop',params)
}
const handlePickup=()=>{
const params={
cptId :matchData.value.id
}
emit('pickup',params)
}
</script>
<style scoped lang="scss">
......@@ -834,4 +847,17 @@ const popMaster = () => {
border-radius: 100px;
background: linear-gradient(-90deg, #8623FC, #453DEA) !important;
}
.ding{
position: fixed;
right:0px;
z-index:99;
top: 40%;
background: linear-gradient(-90deg, #8623FC, #453DEA) !important;
box-shadow: none;
color: #fff;
border-radius: 10px;
//height: 100px;
padding: 20px;
}
</style>
......
......@@ -135,7 +135,7 @@ function popRemark(type) {
|| ( type == '3')
|| (form.value.isMealView == 0 && type == '4')
|| (type == '5')
|| (type == '0')
// || (type == '0')
)
{
building()
......
......@@ -49,3 +49,6 @@ export const getOrderDetail = (data) =>
/** 检查是否支付成功 */
export const checkPaySuccess = (data) =>
request("POST", `/api/order/checkOrderIsPay/${data.orderSn}`, data);
/** 检查是否支付成功 */
export const payCallback = (data) =>
request("POST", `/api/order/palPayTicket/callback/`, data);
......
<script setup>
import { confirmOrder } from "./api/index.js";
import { ElMessage } from "element-plus";
import { payOrder, viewPeopleList, checkPaySuccess } from "./api/index.js";
import qrCodeDialog from "./components/qrCodeDialog.vue";
import qrcode from "qrcode";
import { languageFormat } from "./utils/language.js";
import { useStorage } from "@vueuse/core/index";
const language = useStorage("language", 0);
const route = useRoute();
const router = useRouter();
const props = defineProps({
activityId: [String, Number],
});
let timer = null;
const startCheckSuccessListener = (orderSn, actId) => {
timer = setInterval(() => {
checkPaySuccess({ orderSn }).then((res) => {
if (res.data) {
clearInterval(timer);
timer = null;
// 支付成功
payment.showCodeDialog = false;
ElMessage({
type: "success",
message: languageFormat(
language.value,
"支付成功",
"Payment succeeded"
),
});
router.replace({
path: "/seat/order",
});
} else {
return false;
}
});
}, 3000);
};
const payment = reactive({
showCodeDialog: false,
btn_loading: false,
form: {
viewers: [],
phone: "",
},
qrInfo: {},
qrCodeData: "",
paymentHandle() {
if (payment.form.viewers.length != order.data?.seatInfo?.length)
return ElMessage({
type: "warning",
message: languageFormat(
language.value,
"观看人与购买票数不符",
"The number of viewers does not match the number of tickets purchased."
),
});
if (!payment.form.phone)
return ElMessage({
type: "warning",
message: languageFormat(
language.value,
"请输入联系电话",
"Please enter the contact phone number."
),
});
if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(payment.form.phone)) {
return ElMessage({
type: "warning",
message: languageFormat(
language.value,
"联系电话格式不正确",
"The format of the contact phone is incorrect."
),
});
}
payOrder({
contactPhone: payment.form.phone,
customerIds: payment.form.viewers,
orderToken: order.data?.orderToken,
payType: language.value == 0 ? 1 : 2,
paymentAmount: order.data?.paymentAmount,
}).then((res) => {
if (res.data.language == "zh-cn") {
payment.qrInfo = res.data;
qrcode.toDataURL(res.data.scanCodeUrl, (err, url) => {
if (url) {
payment.qrCodeData = url;
}
});
payment.showCodeDialog = true;
startCheckSuccessListener(res.data.orderSn, props.activityId);
} else {
// TODO:这里是英文环境支付
}
});
},
handleCloce() {
payment.showCodeDialog = false;
payment.qrCodeData = "";
clearInterval(timer);
timer = null;
router.replace({
path: "/seat/order",
});
},
});
const order = reactive({
data: null,
fetchData() {
confirmOrder({
actId: props.activityId,
openType: route.query.openType,
sessionId: route.query.sessionId,
sitePlace: route.query.sitePlace,
ticketType: route.query.ticketType,
seatIds: route.query.seatIds.split(","),
}).then((res) => {
this.data = res.data;
});
},
});
const audience = reactive({
data: [],
fetchData() {
viewPeopleList().then((res) => {
audience.data = res.data;
});
},
});
onUnmounted(() => {
clearInterval(timer);
});
audience.fetchData();
order.fetchData();
</script>
<template>
<div class="container">
<div class="container" v-loading="loading">
<div class="title">
{{ languageFormat(language, "订单确认", "Order confirmation") }}
</div>
......@@ -292,6 +145,160 @@ order.fetchData();
</div>
</template>
<script setup>
import {ref} from 'vue'
import { confirmOrder } from "./api/index.js";
import { ElMessage } from "element-plus";
import { payOrder, viewPeopleList, checkPaySuccess } from "./api/index.js";
import qrCodeDialog from "./components/qrCodeDialog.vue";
import qrcode from "qrcode";
import { languageFormat } from "./utils/language.js";
import { useStorage } from "@vueuse/core/index";
const language = useStorage("language", 0);
const loading = ref(false);
const route = useRoute();
const router = useRouter();
const props = defineProps({
activityId: [String, Number],
});
let timer = null;
const startCheckSuccessListener = (orderSn, actId) => {
timer = setInterval(() => {
checkPaySuccess({ orderSn }).then((res) => {
if (res.data) {
clearInterval(timer);
timer = null;
// 支付成功
payment.showCodeDialog = false;
ElMessage({
type: "success",
message: languageFormat(
language.value,
"支付成功",
"Payment succeeded"
),
});
router.replace({
path: "/seat/order",
});
} else {
return false;
}
});
}, 3000);
};
const payment = reactive({
showCodeDialog: false,
btn_loading: false,
form: {
viewers: [],
phone: "",
},
qrInfo: {},
qrCodeData: "",
paymentHandle() {
if (payment.form.viewers.length != order.data?.seatInfo?.length)
return ElMessage({
type: "warning",
message: languageFormat(
language.value,
"观看人与购买票数不符",
"The number of viewers does not match the number of tickets purchased."
),
});
if (!payment.form.phone)
return ElMessage({
type: "warning",
message: languageFormat(
language.value,
"请输入联系电话",
"Please enter the contact phone number."
),
});
// if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(payment.form.phone)) {
// return ElMessage({
// type: "warning",
// message: languageFormat(
// language.value,
// "联系电话格式不正确",
// "The format of the contact phone is incorrect."
// ),
// });
// }
loading.value=true
payOrder({
contactPhone: payment.form.phone,
customerIds: payment.form.viewers,
orderToken: order.data?.orderToken,
payType: language.value == 0 ? 1 : 2,
paymentAmount: order.data?.paymentAmount,
}).then((res) => {
if (res.data.language == "zh-cn") {
payment.qrInfo = res.data;
qrcode.toDataURL(res.data.scanCodeUrl, (err, url) => {
if (url) {
payment.qrCodeData = url;
}
});
payment.showCodeDialog = true;
startCheckSuccessListener(res.data.orderSn, props.activityId);
} else {
// TODO:这里是英文环境支付
location.href = res.data.scanCodeUrl
}
}).finally(()=>{
loading.value=false
});
},
handleCloce() {
payment.showCodeDialog = false;
payment.qrCodeData = "";
clearInterval(timer);
timer = null;
router.replace({
path: "/seat/order",
});
},
});
const order = reactive({
data: null,
fetchData() {
confirmOrder({
actId: props.activityId,
openType: route.query.openType,
sessionId: route.query.sessionId,
sitePlace: route.query.sitePlace,
ticketType: route.query.ticketType,
seatIds: route.query.seatIds.split(","),
}).then((res) => {
this.data = res.data;
});
},
});
const audience = reactive({
data: [],
fetchData() {
viewPeopleList().then((res) => {
audience.data = res.data;
});
},
});
onUnmounted(() => {
clearInterval(timer);
});
audience.fetchData();
order.fetchData();
</script>
<style scoped lang="scss">
div {
box-sizing: border-box;
......
......@@ -138,7 +138,7 @@ const detail = reactive({
if (detail.pay_loading) return;
detail.pay_loading = true;
// 中文支付
immediatePay({ orderSn: detail.data.orderSn, payType: 1 })
immediatePay({ orderSn: detail.data.orderSn, payType:detail.data?.language=='zh-cn'? 1:2 })
.then((res) => {
if (res.data.language == "zh-cn") {
detail.qrInfo = res.data;
......@@ -151,6 +151,7 @@ const detail = reactive({
startCheckSuccessListener(detail.data.orderSn);
} else {
// TODO:这里是英文环境支付
location.href = res.data.scanCodeUrl
}
})
.finally(() => (detail.pay_loading = false));
......@@ -242,7 +243,7 @@ detail.fetchData();
</script>
<template>
<div class="container">
<div class="container" v-loading="detail.pay_loading">
<div class="left">
<!-- 票务信息 -->
<div class="ticket">
......@@ -257,7 +258,7 @@ detail.fetchData();
{{ languageFormat(language, "单价", "Price") }}
</div>
<div style="width: 10%" class="td">
{{ languageFormat(language, "数量", "Ticket Qty.") }}
{{ languageFormat(language, "数量", "Quantity") }}
</div>
<div style="width: 12%; text-align: right" class="td">
{{ languageFormat(language, "小计", "Subtotal") }}
......@@ -268,14 +269,14 @@ detail.fetchData();
<div style="width: 33%" class="td">{{ detail.data?.name }}</div>
<div style="width: 25%" class="td">{{ detail.data?.placeName }}</div>
<div style="width: 20%" class="td">
<span>{{ language == 0 ? "¥" : "€" }}</span>
<span>{{ detail.data?.language=='zh-cn'? "¥" : "€" }}</span>
{{ detail.data?.singlePrice }}
</div>
<div style="width: 10%" class="td">
x{{ detail.data?.seatList?.length }}
</div>
<div style="width: 12%; text-align: right" class="td">
<span>{{ language == 0 ? "¥" : "€" }}</span>
<span>{{ detail.data?.language=='zh-cn'? "¥" : "€" }}</span>
{{ detail.data?.payAmount }}
</div>
</div>
......@@ -283,18 +284,18 @@ detail.fetchData();
<!-- 座位 -->
<div class="seat_box">
<div class="th">
<div style="width: 30.33%" class="td">
<div style="width: 33%" class="td">
{{ languageFormat(language, "时间座位", "Seat Info") }}
</div>
<div style="width: 30.33%" class="td">
<div style="width: 33%" class="td">
{{ languageFormat(language, "订单信息", "Summary") }}
</div>
<div style="width: 30.33%" class="td">
<div style="width: 33%" class="td">
{{ languageFormat(language, "联系方式", "Contact details") }}
</div>
</div>
<div class="tr">
<div style="width: 30.33%" class="td flex-col">
<div style="width: 33%" class="td flex-col">
<div>
{{ detail.data?.dateStr }}
<span v-if="detail.data?.ticketType == 1" class="tag_t">
......@@ -318,25 +319,32 @@ detail.fetchData();
}}{{ languageFormat(language, "馆", "Venue") }})
</div>
</div>
<div style="width: 30.33%" class="td flex-col">
<div style="width: 33%" class="td flex-col">
<div>
{{ languageFormat(language, "订单编号", "Order No.") }}{{
detail.data?.orderSn
}}
{{ languageFormat(language, "订单编号", "Order No") }}{{ detail.data?.orderSn }}
</div>
<div>
{{ languageFormat(language, "创建时间", "Order Time") }}{{
detail.data?.orderTime
}}
{{ languageFormat(language, "创建时间", "Order Time") }}{{detail.data?.orderTime }}
</div>
</div>
<div style="width: 30.33%" class="td">
<div style="width: 33%" class="td flex-col">
<div>
{{ languageFormat(language, "联系电话", "Telephone") }}{{
detail.data?.contactPhone
}}
{{ languageFormat(language, "联系电话", "Telephone") }}{{ detail.data?.contactPhone }}
<div>&nbsp;</div>
<!-- <br>-->
</div>
<div>
{{languageFormat(language,'支付方式','Form of payments')}}{{detail.data?.language=='en-us'?'PayPal':'微信'}}
</div>
</div>
<!-- <div style="width: 20%" class="td ">-->
<!-- <div>-->
<!--&lt;!&ndash; {{ languageFormat(language, "联系电话", "Telephone") }}{{ detail.data?.contactPhone }}&ndash;&gt;-->
<!-- 微信-->
<!-- </div>-->
<!-- </div>-->
</div>
</div>
<!-- 购票人 -->
......@@ -352,9 +360,7 @@ detail.fetchData();
>
<div>{{ it.name }}</div>
<div class="idcard">
{{ languageFormat(language, "证件号", "ID number") }}{{
it.idCard
}}
{{ languageFormat(language, "证件号", "ID number") }}{{ it.idCard }}
</div>
</div>
</div>
......@@ -389,7 +395,7 @@ detail.fetchData();
class="value"
:style="{ color: status[detail.data?.state]?.color }"
>
<span>{{ language == 0 ? "¥" : "€" }}</span>
<span>{{ detail.data?.language=='zh-cn'? "¥" : "€" }}</span>
{{ detail.data?.payAmount }}
</div>
</div>
......
......@@ -226,7 +226,7 @@ onMounted(() => {
}}
</div>
<div class="common">
{{ languageFormat(language, "订单编号", "Order No.") }}{{
{{ languageFormat(language, "订单编号", "Order No") }}{{
it.orderSn
}}
</div>
......@@ -235,10 +235,7 @@ onMounted(() => {
}}{{ languageFormat(language, "张", "tickets") }}
</div>
<div class="common">
{{ languageFormat(language, "金额", "Ticket Price") }}<span
v-if="language == 0"
></span
>{{ it.payAmount }}
{{ languageFormat(language, "金额", "Ticket Price") }}{{it.payType=='2'?'€':'¥'}}{{ it.payAmount }}
</div>
<div class="status">
<div class="label">
......
<template>
<div>
<div class="box">
<el-card class="mb60 mt30" v-loading="loading">
<div class="text-center mt30">
<el-icon color="#e46962" size="80">
<CircleCloseFilled />
</el-icon>
<p class="text-success mb20">{{ language == 0 ? '支付失败' : 'Payment Failure!' }}</p>
<el-button type="primary" class="btn-lineG mb60" @click="goBillDetail" round>
{{ language == 0 ? '返回订单详情' : 'Return order details' }}
</el-button>
</div>
</el-card>
</div>
</div>
</template>
<script setup>
import {ref} from "vue";
import {useRoute, useRouter} from "vue-router";
import {onMounted} from "@vue/runtime-core";
import {callbackPalPay} from "/@/apiPc/booking";
import {useStorage} from "@vueuse/core/index";
import {payCallback} from '@/viewsPc/seat/api/index'
const route = useRoute()
const router = useRouter()
const language= useStorage('language',0)
const orderId = ref(route.query.orderId)
const form = ref({})
const loading = ref(false)
onMounted(() => {
const code = decodeURIComponent(orderId.value)
loading.value = false
// payCallback({tradeNo:code}).then(res => {
// loading.value = false
// form.value = res.data.orderType
// })
})
function goBillDetail() {
router.push({
path: '/seat/order_detail',
query: { orderSn: orderId.value, id: 1 },
})
}
</script>
<style scoped lang="scss">
</style>
<template>
<div>
<div class="box">
<el-card class="mb60 mt30" v-loading="loading">
<div class="text-center mt30">
<el-icon color="#32B16C" size="80">
<SuccessFilled/>
</el-icon>
<p class="text-success mb20">{{ language == 0 ? '支付成功' : 'successfully!' }}</p>
<el-button type="primary" class="btn-lineG mb60" @click="goBillDetail" round>
{{ language == 0 ? '返回订单详情' : 'Return order details' }}
</el-button>
</div>
</el-card>
</div>
</div>
</template>
<script setup>
import {ref} from "vue";
import {useRoute, useRouter} from "vue-router";
import {onMounted} from "@vue/runtime-core";
import {useStorage} from "@vueuse/core/index";
import {payCallback} from '@/viewsPc/seat/api/index'
const route = useRoute()
const router = useRouter()
const language= useStorage('language',0)
const orderId = ref(route.query.orderId)
const form = ref()
const loading = ref(false)
onMounted(() => {
const code = decodeURIComponent(orderId.value)
loading.value = true
payCallback({tradeNo:code}).then(res => {
loading.value = false
form.value = res.data
})
})
function goBillDetail() {
router.push({
path: '/seat/order_detail',
query: { orderSn: form.value.orderSn, id: form.value.actId },
})
}
</script>
<style scoped lang="scss">
</style>
......@@ -9,7 +9,7 @@ const route = useRoute();
const router = useRouter();
const iframeRef = ref();
const loading=ref(true)
const props = defineProps({
activityId: [String, Number],
});
......@@ -62,6 +62,7 @@ function onWindowMessage(e) {
sendMsg("load-seats", seat_arr);
setTimeout(() => {
moveToPriceArea(route.query.ticket_block);
loading.value=false
}, 500);
});
......@@ -304,7 +305,7 @@ price.fetchData();
</script>
<template>
<div class="container">
<div class="container" v-loading="loading">
<div class="top">
<div class="time">
<span>{{ route.query?.time_txt }}</span>
......
......@@ -362,6 +362,10 @@ watch(
>
{{ it.placeName }}
</div>
<div style="padding-top: 10px" v-if="language==0">
备注:B6馆(国际赛事),B4馆(国内赛事),最终以实际赛事表为准
</div>
</div>
</div>
<!-- 票档 -->
......
......@@ -12,7 +12,7 @@ const baseURL = import.meta.env.VITE_TICKET_BASE_API
// const baseURL = "ticket"; //"http://book.xiaojinyu.games"; // 这里填入你的基础 API URL
const timeout = 15000; // 请求超时时间
const timeout = 150000; // 请求超时时间
const http = axios.create({
baseURL,
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!