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