Browse Source

add venue ticket logic

dev
刘嘉炜 4 days ago
parent
commit
b9ade98892
  1. 14
      src/pages/index/index.vue
  2. 1
      src/subpackage/groupon/api/index.js
  3. 14
      src/subpackage/groupon/components/site/table.vue
  4. 132
      src/subpackage/groupon/pages/confirm_order/venue.vue
  5. 16
      src/subpackage/groupon/pages/site_select.vue

14
src/pages/index/index.vue

@ -10,20 +10,6 @@ onLoad(() => {
// .then(res=>{
// console.log('stadiumFind', res);
// })
tt.login({
success() {
tt.showToast({
title: "登录成功",
icon: "success",
});
},
fail() {
tt.showToast({
title: "登录失败",
icon: "fail",
});
},
});
});

1
src/subpackage/groupon/api/index.js

@ -8,6 +8,7 @@ export const userCertificates = params => server.post({ url: '/douyinMiniapp/202
export const countCity = params => server.post({ url: '/stadium/count/city', ...params }); // A主页-选择门店-城市列表
export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 门店列表
export const jsapiPreVerifyCertificates = params => server.post({ url: '/douyinMiniapp/202506/jsapiPreVerifyCertificates', ...params }); // 票券核销
export const orderAdd = params => server.post({ url: '/stadium/order/add', ...params }); // 生成场馆预约订单

14
src/subpackage/groupon/components/site/table.vue

@ -4,14 +4,14 @@ import { reactive, ref, computed, nextTick } from 'vue';
import { deepClone } from "@/utils";
import { showNone } from "@/utils/polish";
import { AutoSelect } from "../../js/site_select/autoSelect";
const emits = defineEmits([ 'update:table' ]);
const emits = defineEmits([ 'update:sitetable' ]);
const props = defineProps({
tableData: { default: [] },
sitetable: { default: [] },
altitude: { default: 0 }
})
const timeList = computed(_=> {
let _table = props?.tableData;
let _table = props?.sitetable;
if(_table?.length <= 0)return [];
let _items = _table?.[0]?.items ?? [], _tempArr;
if(_items?.length <=0)return [];
@ -29,7 +29,7 @@ onLoad(() => {
const itemClick = function(k, i, j){
if(k.is_valid === false)return showNone('该场次已出售');
let _tableCopy = deepClone(props?.tableData);
let _tableCopy = deepClone(props?.sitetable);
_tableCopy[i].items[j]._is_selected = !k?._is_selected;
//
//
@ -45,7 +45,7 @@ const itemClick = function(k, i, j){
//
nextTick(_=>autoSelect.showModalList(_noticeList || []));
emits('update:table', _tableCopy);
emits('update:sitetable', _tableCopy);
}
@ -62,10 +62,10 @@ const itemClick = function(k, i, j){
</view>
<!-- 顶部栏 -->
<view class="std-top-sticky">
<view class="sts-item" v-for="(e, i) in tableData" :key="i">{{ e.name || '-' }}</view>
<view class="sts-item" v-for="(e, i) in sitetable" :key="i">{{ e.name || '-' }}</view>
</view>
<view class="std-data">
<view class="sd-column" v-for="(e, i) in tableData" :key="i">
<view class="sd-column" v-for="(e, i) in sitetable" :key="i">
<view class="sc-row" v-for="(k, j) in e.items" :key="j">
<view
class="sr-item"

132
src/subpackage/groupon/pages/confirm_order/venue.vue

@ -4,19 +4,106 @@ import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import confirmTemplate from "../../components/confirm_template.vue";
import ticketItem from "../../components/ticket_item.vue";
import venueInfo from "../../components/venue_info.vue";
import { jsapiPreVerifyCertificates, orderAdd } from "../../api";
import { routeTo, showModal, showLoad, hideLoad } from '@/utils/polish';
const stadiumInfo = ref({});
const ticketInfo = ref({});
const venueData = ref({});
const verify_token = ref('');
const APPID = tt.getEnvInfoSync()?.microapp?.appId ?? '';
onMounted(() =>{
const instance = getCurrentInstance().proxy
const eventChannel = instance.getOpenerEventChannel();
eventChannel.on('dataFromGrouponSiteSelect', data => {
stadiumInfo.value = data?.stadium ?? {};
ticketInfo.value = data?.ticket ?? {};
venueData.value = data?.venueInfo ?? {};
let { stadium, ticket, venueInfo } = data;
stadiumInfo.value = stadium ?? {};
ticketInfo.value = ticket ?? {};
venueData.value = venueInfo ?? {};
console.warn('dataFromGrouponSiteSelect data', data);
let _classTags = (venueInfo?.venues ?? []).map(e=>e?._class_tag ?? '');
pvc_func({
appid: APPID,
brand_id: stadium?.brand_id ?? '',
stadium_id: stadium?.id ?? '',
encrypted_codes: ticket?.encrypted_codes ?? '',
douyin_merchant_pay_amount: ticket?.douyin_merchant_pay_amount ?? '',
certificate_id: ticket?.certificate_id ?? '',
certificate: ticket?.certificates ?? null,
//
classify: venueInfo?.classify ?? '',
class_tags: _classTags.filter(e=>e!=='').join(','),
})
})
})
function pvc_func(data){
jsapiPreVerifyCertificates({ data })
.then(res=>{
// routeTo(`/subpackage/groupon/pages/exchange_success`);
console.log('jsapiPreVerifyCertificates', res);
verify_token.value = res?.data?.verify_token ?? '';
})
}
function confirmBtn(){
let _tVal = ticketInfo.value;
const _query = {
verifyToken: verify_token.value ?? '',
poiId: _tVal?.poi_id ?? '',
orderList: [{
orderId: _tVal?.order_id ?? '',
certificateList: [ _tVal?.certificate_id ?? '' ]
}],
orderEntrySchema: {
// verify_tokencid,
path: 'subpackage/order/pages/detail',
params: JSON.stringify({ certificate_id: _tVal?.certificate_id ?? '' }),
},
success(res){
hideLoad();
console.warn('verifyCertificates success', res);
showModal({ content: '核销成功!' });
let _classTags = (venueData.value?.venues ?? []).map(e=>e?._class_tag ?? '');
createBookOrder({
appid: APPID,
brand_id: stadiumInfo.value?.brand_id ?? '',
stadium_id: stadiumInfo.value?.id ?? '',
date: venueData.value?.date,
sessions: (venueData.value?.venues || []).map(el=>({
venue_id: el?.venue_id ?? '',
duration: el?.time ?? '',
price: el?.price ?? 0,
tag: el?._class_tag ?? '',
})),
type_key: venueData.value?.classify ?? '',
class_tags_enable: _classTags.filter(e=>e!=='').join(','),
verify_token: verify_token.value ?? '',
douyin_merchant_pay_amount: _tVal?.douyin_merchant_pay_amount ?? 0,
douyin_groupon_coupon_code: _tVal?.certificate_id ?? ''
})
},
fail(err){
hideLoad();
console.warn('verifyCertificates fail', err);
showModal({ content: err?.errMsg ?? '兑换操作失败!' })
},
}
console.log('tt.verifyCertificates data -->', _query)
showLoad();
return tt.verifyCertificates(_query);
}
function createBookOrder(data){
orderAdd({ data })
.then(res=>{
console.log('createBookOrder', res);
})
}
</script>
@ -43,7 +130,7 @@ onMounted(() =>{
<image class="tti-icon" mode="aspectFit" src="@/subpackage/groupon/static/images/ticket_icon.png"></image>
<view class="tti-right">
<view class="tr-txt">团购券 <text class="tt-orange">已选1张</text> </view>
<view class="tr-price">团购券抵扣6小时-¥600.00</view>
<view class="tr-price">{{ ticketInfo?.merchandise_name ?? '-' }}</view>
</view>
</view>
<view class="vc-box vc-groupon">
@ -68,6 +155,15 @@ onMounted(() =>{
<view class="vc-txt">*同一订单不支持部分场次退款</view>
</view>
</view>
<template #fixed>
<view class="ti-fixed">
<view class="cf-price" v-if="0 >= 0">
<text class="cp-txt">应付金额</text> ¥{{ 0 }}
</view>
<button v-if="verify_token" class="cf-btn" :class="{ 'cf-full': 0 < 0 }" @click="confirmBtn" data-eventsync>确认兑换</button>
</view>
</template>
</confirm-template>
</template>
@ -151,4 +247,30 @@ onMounted(() =>{
}
}
.ti-fixed{
@include ctf;
.cf-btn{
@include clearBtn;
flex-shrink: 0;
flex-grow: 0;
margin-left: 12upx;
width: 240upx;
text-align: center;
border-radius: 20upx;
background-color: $redColor;
@include flcw(32upx, 88upx, #fff);
&.cf-full{
flex-grow: 1;
width: auto;
}
}
.cf-price{
flex-grow: 1;
@include flcw(40upx, 56upx, $redColor, 500);
.cp-txt{
@include flcw(28upx, 56upx, #333);
}
}
}
</style>

16
src/subpackage/groupon/pages/site_select.vue

@ -28,7 +28,8 @@ const selectedData = computed(_=>{ // 已选中场地
_temArr.push({
...ele,
_venue_id: e?.id ?? 0,
_venue_name: e?.name ?? ''
_venue_name: e?.name ?? '',
_class_tag: e?.class_tag ?? '',
})
})
});
@ -149,13 +150,10 @@ function getBookList({
return siteData.value = res?.data;
})
}
// Page.onReady
onReady(_=>{
setScrollViewSize();
});
// table
async function setScrollViewSize(){
const _sysInfo = uni.getSystemInfoSync(true);
const _sysInfo = uni.getSystemInfoSync();
let _headerInfo = await getNodeMes('#ssHeader');
let _dateBarInfo = await getNodeMes(`#smDates`);
let _footerInfo = await getNodeMes('#ssFooter');
@ -164,6 +162,7 @@ async function setScrollViewSize(){
}
function submitClick(venues){
console.warn('submitClick venues', venues);
uni.navigateTo({
url: `/subpackage/groupon/pages/confirm_order/venue`,
success: res => {
@ -171,6 +170,7 @@ function submitClick(venues){
stadium: stadiumInfo.value,
ticket: ticketInfo,
venueInfo: {
classify: currentVenueType.value?.key ?? '',
typeName: currentVenueType.value?.name ?? '',
date: (currentBookDate.value?.date ?? '').slice(0, 10),
zh_day: currentBookDate.value?._zh_day,
@ -181,6 +181,7 @@ function submitClick(venues){
price: e?.price ?? '',
date: e?.date ?? '',
index: e?.index ?? '',
_class_tag: e?._class_tag ?? '',
}))
},
})
@ -223,9 +224,8 @@ function submitClick(venues){
</view>
</scroll-view>
<site-table
:table-data="siteData"
:altitude="scrollHeight"
v-model:table="siteData"
v-model:sitetable="siteData"
></site-table>
</view>
<view class="ss-footer" id="ssFooter">

Loading…
Cancel
Save