Browse Source

exchange logic

dev
刘嘉炜 1 day ago
parent
commit
4e4568a07e
  1. 1
      src/api/index.js
  2. 2
      src/api/server.js
  3. 6
      src/pages/member/index.vue
  4. 45
      src/pages/order/list.vue
  5. 1
      src/subpackage/groupon/api/index.js
  6. 64
      src/subpackage/groupon/pages/confirm_order/venue.vue

1
src/api/index.js

@ -7,3 +7,4 @@ export const douyinMiniAppLoginAndSync = params => server.post({ url: '/user/dou
export const login = params => server.post({ url: '/Admino/AdminUser/login', ...params }); // 登录 export const login = params => server.post({ url: '/Admino/AdminUser/login', ...params }); // 登录
export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 登录 export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 登录
export const stadiumBookList = params => server.post({ url: '/stadium/book/list', ...params }); // 订场列表 export const stadiumBookList = params => server.post({ url: '/stadium/book/list', ...params }); // 订场列表
export const orderList = params => server.post({ url: '/stadium/order/list', ...params }); // 预约订单列表

2
src/api/server.js

@ -21,7 +21,7 @@ server.interceptors.request.use(
let _token = uni.getStorageSync('token'); let _token = uni.getStorageSync('token');
if(_token)config.data.token = _token; if(_token)config.data.token = _token;
// 后端: 加这个好像就不用传品牌id了吧 // 后端: 加这个好像就不用传品牌id了吧
config.data.from_platform = 'ouxuan_org_douyin';
if(!config?.data?.from_platform)config.data.from_platform = 'ouxuan_org_douyin';
loading.show(config.loading); loading.show(config.loading);
return config; return config;
}, },

6
src/pages/member/index.vue

@ -46,10 +46,10 @@ function login() {
<view class="mi-header"> <view class="mi-header">
<view class="mh-user" v-if="tkStr"> <view class="mh-user" v-if="tkStr">
<!-- <image class="mh-avatar"></image> --> <!-- <image class="mh-avatar"></image> -->
<open-data type="userAvatarUrl" use-empty-value @error="handleError" />
<open-data class="mh-avatar" type="userAvatarUrl" use-empty-value @error="handleError" />
<view class="mh-info"> <view class="mh-info">
<!-- <view class="mi-name">抖音用户</view> --> <!-- <view class="mi-name">抖音用户</view> -->
<open-data type="userNickName" default-text="empty" @error="handleError" />
<open-data class="mi-name" type="userNickName" default-text="empty" @error="handleError" />
<!-- <view class="mi-num">17688184874</view> --> <!-- <view class="mi-num">17688184874</view> -->
</view> </view>
@ -88,7 +88,7 @@ function login() {
width: 128upx; width: 128upx;
height: 128upx; height: 128upx;
border-radius: 50%; border-radius: 50%;
background-color: #fff;
overflow: hidden;
} }
.mh-info{ .mh-info{
padding-top: 8upx; padding-top: 8upx;

45
src/pages/order/list.vue

@ -1,20 +1,46 @@
<script setup> <script setup>
import { onLoad } from '@dcloudio/uni-app';
import { onLoad, onReachBottom } from '@dcloudio/uni-app';
import tabBar from "@/components/tab_bar.vue"; import tabBar from "@/components/tab_bar.vue";
import { routeTo } from '@/utils/polish';
import { routeTo, showNone } from '@/utils/polish';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { orderList } from "@/api";
const tab = reactive({ const tab = reactive({
list: [ {name: '全部'}, {name: '已核销'}, {name: '已退款'}, ], list: [ {name: '全部'}, {name: '已核销'}, {name: '已退款'}, ],
idx: 0 idx: 0
}); });
onLoad(() => {
const loadPage = 1;
const orderLs = ref([]);
onLoad(() => {
getOrderLs({});
}); });
onReachBottom(()=>{
getOrderLs({
page: ++loadPage
});
})
function toOrderDetail(){ function toOrderDetail(){
routeTo('/subpackage/order/pages/detail'); routeTo('/subpackage/order/pages/detail');
} }
function getOrderLs({
page = 1,
page_size = 15,
status = ''
}){
orderList({ data: { page, page_size, status } })
.then(res=>{
console.warn('orderList', res);
let _ls = res?.data?.list ?? [];
if(page === 1)return orderLs.value = _ls;
if(_ls?.length <= 0)return showNone('没有更多!');
loadPage = page;
orderLs.value.push(..._ls);
})
}
</script> </script>
<template> <template>
@ -23,19 +49,19 @@ function toOrderDetail(){
<tab-bar :tabs="tab.list" v-model:idx="tab.idx"></tab-bar> <tab-bar :tabs="tab.list" v-model:idx="tab.idx"></tab-bar>
</view> </view>
<view class="ol-list-content"> <view class="ol-list-content">
<view class="ol-item" v-for="i in 10" :key="i" @click="toOrderDetail">
<view class="ol-item" v-for="(e, i) in orderLs" :key="i" @click="toOrderDetail">
<view class="oi-header"> <view class="oi-header">
<image class="oh-logo"></image>
<view class="oh-name">MJ体育(天空篮球从云店)</view>
<image class="oh-logo" mode="aspectFit" :src="e.stadium_logo"></image>
<view class="oh-name">{{ e.stadium_name ?? '-' }}</view>
<view class="oh-status">已核销</view> <view class="oh-status">已核销</view>
</view> </view>
<view class="oi-info"> <view class="oi-info">
<view class="oi-line"><text class="ol-txt">订单信息</text>羽毛球订场200元代金券欧轩客服</view>
<view class="oi-line"><text class="ol-txt">订单编号</text>3107858392102658852</view>
<view class="oi-line"><text class="ol-txt">订单信息s</text>羽毛球订场200元代金券欧轩客服</view>
<view class="oi-line"><text class="ol-txt">订单编号</text>{{ e.order_no ?? '-' }}</view>
</view> </view>
<view class="oi-bottom"> <view class="oi-bottom">
<view class="ob-time">2025-08-17 18:02:45 核销</view> <view class="ob-time">2025-08-17 18:02:45 核销</view>
<view class="ob-price"><text class="op-txt">支付</text>¥0</view>
<view class="ob-price"><text class="op-txt">支付</text>¥{{ e.pay_amount ?? '0' }}</view>
</view> </view>
</view> </view>
</view> </view>
@ -68,7 +94,6 @@ function toOrderDetail(){
margin-right: 10upx; margin-right: 10upx;
width: 34upx; width: 34upx;
height: 34upx; height: 34upx;
background: skyblue;
} }
.oh-name{ .oh-name{
flex-grow: 1; flex-grow: 1;

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

@ -9,6 +9,7 @@ export const countCity = params => server.post({ url: '/stadium/count/city', ...
export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 门店列表 export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 门店列表
export const jsapiPreVerifyCertificates = params => server.post({ url: '/douyinMiniapp/202506/jsapiPreVerifyCertificates', ...params }); // 票券核销 export const jsapiPreVerifyCertificates = params => server.post({ url: '/douyinMiniapp/202506/jsapiPreVerifyCertificates', ...params }); // 票券核销
export const orderAdd = params => server.post({ url: '/stadium/order/add', ...params }); // 生成场馆预约订单 export const orderAdd = params => server.post({ url: '/stadium/order/add', ...params }); // 生成场馆预约订单
export const orderPayMini = params => server.post({ url: '/stadium/order/pay/mini', ...params }); // A预约场馆-预约场馆-微信支付[小程序]

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

@ -4,7 +4,7 @@ import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import confirmTemplate from "../../components/confirm_template.vue"; import confirmTemplate from "../../components/confirm_template.vue";
import ticketItem from "../../components/ticket_item.vue"; import ticketItem from "../../components/ticket_item.vue";
import venueInfo from "../../components/venue_info.vue"; import venueInfo from "../../components/venue_info.vue";
import { jsapiPreVerifyCertificates, orderAdd } from "../../api";
import { jsapiPreVerifyCertificates, orderAdd, orderPayMini } from "../../api";
import { routeTo, showModal, showLoad, hideLoad } from '@/utils/polish'; import { routeTo, showModal, showLoad, hideLoad } from '@/utils/polish';
const stadiumInfo = ref({}); const stadiumInfo = ref({});
const ticketInfo = ref({}); const ticketInfo = ref({});
@ -49,7 +49,9 @@ function pvc_func(data){
} }
function confirmBtn(){ function confirmBtn(){
let _tVal = ticketInfo.value; let _tVal = ticketInfo.value;
let _classTags = (venueData.value?.venues ?? []).map(e=>e?._class_tag ?? '');
const _query = { const _query = {
verifyToken: verify_token.value ?? '', verifyToken: verify_token.value ?? '',
@ -67,41 +69,63 @@ function confirmBtn(){
hideLoad(); hideLoad();
console.warn('verifyCertificates success', res); console.warn('verifyCertificates success', res);
showModal({ content: '核销成功!' }); showModal({ content: '核销成功!' });
let _classTags = (venueData.value?.venues ?? []).map(e=>e?._class_tag ?? '');
return createServerOrder();
},
fail(err){
hideLoad();
console.warn('verifyCertificates fail', err);
showModal({ content: err?.errMsg ?? '兑换操作失败!' })
},
}
console.log('tt.verifyCertificates data -->', _query)
showLoad();
return tt.verifyCertificates(_query);
}
function createServerOrder(){
let _tVal = ticketInfo.value, _vVal = venueData.value, _sVal = stadiumInfo.value;
let _classTags = (_vVal?.venues ?? []).map(e=>e?._class_tag ?? '');
createBookOrder({ createBookOrder({
appid: APPID, appid: APPID,
brand_id: stadiumInfo.value?.brand_id ?? '',
stadium_id: stadiumInfo.value?.id ?? '',
date: venueData.value?.date,
sessions: (venueData.value?.venues || []).map(el=>({
brand_id: _sVal?.brand_id ?? '',
stadium_id: _sVal?.id ?? '',
date: _vVal?.date,
sessions: (_vVal?.venues || []).map(el=>({
venue_id: el?.venue_id ?? '', venue_id: el?.venue_id ?? '',
duration: el?.time ?? '', duration: el?.time ?? '',
price: el?.price ?? 0, price: el?.price ?? 0,
tag: el?._class_tag ?? '', tag: el?._class_tag ?? '',
})), })),
type_key: venueData.value?.classify ?? '',
type_key: _vVal?.classify ?? '',
class_tags_enable: _classTags.filter(e=>e!=='').join(','), class_tags_enable: _classTags.filter(e=>e!=='').join(','),
verify_token: verify_token.value ?? '', verify_token: verify_token.value ?? '',
douyin_merchant_pay_amount: _tVal?.douyin_merchant_pay_amount ?? 0, douyin_merchant_pay_amount: _tVal?.douyin_merchant_pay_amount ?? 0,
douyin_groupon_coupon_code: _tVal?.certificate_id ?? ''
douyin_groupon_coupon_code: _tVal?.certificate_id ?? '',
}) })
},
fail(err){
hideLoad();
console.warn('verifyCertificates fail', err);
showModal({ content: err?.errMsg ?? '兑换操作失败!' })
},
.then(cRes=>{
console.log('createBookOrder', cRes);
if(!cRes?.order_no)return;
orderPayMini({
data: {
appid: APPID,
brand_id: _sVal?.brand_id ?? '',
stadium_id: _sVal?.id ?? '',
order_no: cRes?.order_no,
platform_type: "wechat_platform",
} }
console.log('tt.verifyCertificates data -->', _query)
showLoad();
return tt.verifyCertificates(_query);
})
.then(oRes=>{
console.warn('orderPayMini', oRes);
})
})
} }
function createBookOrder(data){ function createBookOrder(data){
orderAdd({ data })
return orderAdd({ data })
.then(res=>{ .then(res=>{
console.log('createBookOrder', res);
return res?.data ?? {}
}) })
} }

Loading…
Cancel
Save