完善茶艺师套餐功能优化

This commit is contained in:
wangxiaowei
2026-04-03 15:02:49 +08:00
parent 401b1f0d2f
commit c0547289f8
13 changed files with 460 additions and 406 deletions

View File

@ -15,7 +15,9 @@ export function getTeaPackageList() {
* 获取茶艺师套餐详情
*/
export function getTeaPackageDetail(id: number) {
return http.Post<any>('/api/Teamaster/teamasterGroupDetails', { id })
return http.Post<any>('/api/Teamaster/teamasterGroupDetails', { id }, {
meta: { ignoreAuth: true }
})
}
/**

View File

@ -17,6 +17,7 @@ export interface ITeaSpecialistParams {
longitude: number
level?: string
search?: string
server_type?: number // 1到店服务 2上门服务
}
export function getTeaSpecialist(data: ITeaSpecialistParams) {

View File

@ -26,7 +26,7 @@
<view>
<view class="text-26rpx leading-32rpx text-#606266">公司名称</view>
<view class="mt-20rpx border-b border-b-solid border-b-[#F6F7F8] pb-20rpx">
<wd-input no-border placeholder="请填写真实姓名" v-model="form.company_name"></wd-input>
<wd-input no-border placeholder="请填写公司名称" v-model="form.company_name"></wd-input>
</view>
</view>
<view class="mt-22rpx">
@ -38,7 +38,7 @@
<view class="mt-22rpx">
<view class="text-26rpx leading-32rpx text-#606266">手机号</view>
<view class="mt-20rpx border-b border-b-solid border-b-[#F6F7F8] pb-20rpx">
<wd-input no-border placeholder="请填写真实姓名" v-model="form.mobile"></wd-input>
<wd-input no-border placeholder="请填写手机号" v-model="form.mobile"></wd-input>
</view>
</view>
</view>

View File

@ -1,6 +1,5 @@
<!-- 使用 type="home" 属性设置首页其他页面不需要设置默认为page -->
<route lang="jsonc" type="page">{
"needLogin": true,
"layout": "tabbar",
"style": {
"navigationStyle": "custom"
@ -213,7 +212,7 @@ const Detail = {
},
/**
* 提交订单
* 立即预约
*/
handleReserve: async () => {
router.navigateTo('/bundle/package/service')

View File

@ -203,7 +203,7 @@
<view class="mx-60rpx mb-50rpx">
<view class="text-32rpx leading-44rpx text-#303133">
<text class="mr-20rpx">预定茶叶</text>
<text class="text-26rpx leading-36rpx text-#909399">支持多选</text>
<text class="text-26rpx leading-36rpx text-#909399">任选一款</text>
</view>
<view class="mt-28rpx">
<view class="grid grid-cols-3 gap-x-16rpx gap-y-16rpx">
@ -727,20 +727,20 @@ const Reserve = {
},
/**
* 切换预定茶叶选择
* 切换预定茶叶选择 (单选)
*/
handleToggleTea: (id: number, name: string, price: number) => {
const index = selectedTea.value.indexOf(id)
if (index >= 0) {
// 已选择,取消选择
selectedTea.value.splice(index, 1)
selectedTeaTxt.value.splice(index, 1)
selectedTeaPrice.value.splice(index, 1)
selectedTea.value = []
selectedTeaTxt.value = []
selectedTeaPrice.value = []
} else {
// 未选择,添加选择
selectedTea.value.push(id)
selectedTeaTxt.value.push(name)
selectedTeaPrice.value.push(price)
// 未选择,设置为当前选择 (排他单选)
selectedTea.value = [id]
selectedTeaTxt.value = [name]
selectedTeaPrice.value = [price]
}
totalSelectedTeaPrice.value = toPlus(selectedTeaPrice.value)

View File

@ -289,7 +289,7 @@ const Service = {
}
uni.setStorageSync('selectedPackageService', address) // 将选择的服务信息存储到本地,供下一个页面使用
router.navigateTo('/bundle/package/tea-specialist')
router.navigateTo('/bundle/package/tea-specialist?serviceType=' + serviceType.value) // 跳转到下一个页面,并传递服务方式参数
}
}
</script>

View File

@ -15,8 +15,8 @@
<view class="text-30rpx font-bold text-[#303133]">茶艺师</view>
<view class="text-24rpx text-[#818CA9] mt-12rpx mb-32rpx font-500">匹配心动茶艺师</view>
<view class="flex flex-wrap justify-between">
<view class="w-216rpx mb-30rpx relative" v-for="(item, index) in list" :key="index"
<view class="grid grid-cols-3 gap-y-20rpx gap-x-20rpx justify-items-center">
<view class="w-216rpx relative" v-for="(item, index) in list" :key="index"
@click="TeaSpecialist.handleSelect(index)">
<view class="relative w-216rpx h-216rpx rounded-16rpx overflow-hidden">
<wd-img :src="item.image" width="216rpx" height="216rpx" mode="aspectFill"></wd-img>
@ -40,7 +40,7 @@
</view>
</view>
<view class="flex justify-center mt-10rpx">
<view class="flex justify-center mt-40rpx">
<view class="flex items-center justify-center bg-[#F6F7F8] rounded-34rpx h-100rpx w-320rpx"
@click="TeaSpecialist.handleMore">
<wd-img :src="`${OSS}icon/icon_more.png`" width="36rpx" height="36rpx"></wd-img>
@ -62,7 +62,7 @@
<view class="flex items-center text-24rpx text-[#909399] mb-16rpx">
<wd-img :src="`${OSS}icon/icon_store_cert.png`" width="36rpx" height="36rpx"
class="mr-8rpx"></wd-img>
<text>商家认证</text>
<text @click="TeaSpecialist.handlePreviewInfo">{{ info.company_abv }}</text>
</view>
<view class="flex items-center">
<wd-rate v-model="info.sold" readonly active-color="#FF5951" allow-half
@ -137,9 +137,10 @@
<script lang="ts" setup>
import { inject, ref, computed } from 'vue'
import { router } from '@/utils/tools'
import { router, previewImage } from '@/utils/tools'
import { getTeaSpecialist, getTeaSpecialistDetail } from '@/api/tea-specialist'
import type { ITeaSpecialistResult } from '@/api/types/tea-specialist'
import { toast } from '@/utils/toast'
const OSS = inject('OSS')
@ -164,10 +165,16 @@ const info = ref({
mileage_price: 0, // 车马费
server_type: 0, // 服务方式 1到店 2上门 3两者都有
label: [], // 专属圈子标签
company_abv: '', // 公司简称
company_url: '', // 图片链接
company_status: 0, // 是否有公司信息
})
const serviceType = ref<number>(1) // 服务方式,默认为到店服务
onLoad((args) => {
serviceType.value = args.serviceType || 1 // 默认到店服务
onLoad(() => {
TeaSpecialist.handleGetTeaSpecialistList()
})
@ -186,6 +193,7 @@ const TeaSpecialist = {
latitude: storage.latitude || import.meta.env.VITE_DEFAULT_LATITUDE,
longitude: storage.longitude || import.meta.env.VITE_DEFAULT_LONGITUDE,
level: uni.getStorageSync('teaPackageType'),
server_type: serviceType.value, // 1到店服务 2上门服务
}
try {
const res = await getTeaSpecialist(filter)
@ -241,6 +249,17 @@ const TeaSpecialist = {
handleNext: () => {
console.log("🚀 ~ info.value:", info.value)
router.navigateTo(`/bundle/package/reserve?id=${info.value.team_user_id}`)
},
/**
* 查看商家信息
*/
handlePreviewInfo: () => {
if (info.value.company_status) {
previewImage(info.value.company_url, [info.value.company_url])
} else {
toast.info('暂无商家信息')
}
}
}

View File

@ -116,7 +116,7 @@
<view class="flex items-center">
<wd-img :src="`${OSS}icon/icon_store_cert.png`" width="36rpx" height="36rpx"></wd-img>
</view>
<text class="ml-8rpx font-400 text-24rpx leading-4rpx text-#303133">商家认证</text>
<text class="ml-8rpx font-400 text-24rpx leading-4rpx text-#303133" @click="Detail.handlePreviewInfo">{{ info.company_abv }}</text>
</view>
<view class="bg-[#EBFBF7] w-692rpx h-64rpx rounded-12rpx p-14rpx flex items-center mt-22rpx text-[#35C1A0]">
@ -331,6 +331,9 @@ const info = ref({
mileage_price: 0, // 车马费
server_type: 0, // 服务方式 1到店 2上门 3两者都有
label: [], // 专属圈子标签
company_abv: '', // 公司简称
company_url: '', // 图片链接
company_status: 0, // 是否有公司信息
})
const latitude = ref<number>(0) // 纬度
const longitude = ref<number>(0) // 经度
@ -510,6 +513,17 @@ const Detail = {
*/
handlePreviewImage: (e: { index: number, item: any }) => {
previewImage(info.value.image_arr[e.index], info.value.image_arr)
},
/**
* 查看商家信息
*/
handlePreviewInfo: () => {
if (info.value.company_status) {
previewImage(info.value.company_url, [info.value.company_url])
} else {
toast.info('暂无商家信息')
}
}
}
</script>

View File

@ -59,28 +59,27 @@
:up="upOption" fixed>
<view class="flex items-center bg-white p-20rpx rounded-10rpx mx-30rpx mb-20rpx relative"
v-for="(item, index) in list" :key="index">
<view
class="tea-specialist-time absolute z-3 top-6rpx left-0 bg-[#4C9F44] text-[#fff] font-400 text-18rpx flex items-center justify-center">
<text v-if="item.state == 0">可约</text>
<text v-if="item.state == 1">工作中</text>
<text v-if="item.state == 2">不可约</text>
</view>
<view class="mr-28rpx relative z-2" @click="List.handlePreviewImage(item.image)">
<wd-img width="200rpx" height="200rpx" :src="item.image" mode="aspectFill"></wd-img>
<wd-img width="260rpx" height="320rpx" :src="item.image" mode="aspectFill" radius="10rpx"></wd-img>
<view
class="tea-specialist-time absolute z-3 top-26rpx left-0 bg-[#4C9F44] text-[#fff] font-400 text-18rpx flex items-center justify-center">
<text v-if="item.state == 0">可约</text>
<text v-if="item.state == 1">工作中</text>
<text v-if="item.state == 2">不可约</text>
</view>
</view>
<view class="flex-1" @click="List.handleReserveTeaSpecialist(item.team_user_id, item.state)">
<view class="flex items-center">
<view class="font-bold text-[#303133] text-30rpx leading-42rpx mr-14rpx">
<view class="flex items-center mb-8rpx">
<view class="font-bold text-[#303133] text-30rpx leading-42rpx mr-12rpx">
{{ item.name }}
</view>
<view class="flex items-center">
<wd-icon name="star-on" size="22rpx" color="#FF5951"></wd-icon>
<view class="font-400 text-24rpx text-[#FF5951] leading-34rpx ml-6rpx">5.0</view>
<!-- <tea-specialist-level :level="item.level"></tea-specialist-level> -->
<view class="font-400 text-24rpx text-[#FF5951] leading-34rpx ml-6rpx">{{ item.star }}</view>
</view>
</view>
<view class="flex items-center">
<view class="flex items-center mb-14rpx">
<!-- 到店服务标签 -->
<view class="mr-12rpx" v-if="item.server_type == 1 || item.server_type == 3">
<wd-tag color="#F55726" bg-color="#F55726" plain
@ -102,15 +101,16 @@
</view>
</view>
<view class="flex flex-wrap items-center mt-14rpx">
<view
class="mr-8rpx bg-[#4C9F44] text-[#fff] px-10rpx leading-34rpx font-400 text-24rpx rounded-4rpx"
<view class="flex flex-wrap items-center mt-14rpx mb-24rpx">
<view
class="mr-8rpx px-10rpx leading-34rpx font-400 text-24rpx rounded-4rpx mb-14rpx"
:style="List.handleGetLabelStyle(Number(index))"
v-for="(label, index) in item.label" :key="index">
{{ label.label_name }}
</view>
</view>
<view class="flex items-center justify-between mt-18rpx">
<view class="flex items-center justify-between mb-8rpx">
<view class="mr-20rpx w-200rpx">
<view class="flex items-center">
<view class="flex items-center">
@ -155,8 +155,8 @@ const OSS = inject('OSS')
const navbarHeight = inject('navbarHeight')
const toast = useToast()
// 茶艺师等级
const selectedLevel = ref<Array<any>>([]) // 选择茶艺师的点击等级
// 茶艺师等级(单选)
const selectedLevel = ref<Array<any>>([]) // 当前选中的茶艺师等级
// mescroll
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook
@ -195,6 +195,16 @@ onShareAppMessage(() => {
})
const List = {
handleGetLabelStyle: (index: number) => {
const firstThreeStyles = [
{ backgroundColor: '#FAF1F1', color: '#CE295A' },
{ backgroundColor: '#F1F3FA', color: '#2934CE' },
{ backgroundColor: '#F1FAF9', color: '#29C9CE' },
]
return firstThreeStyles[index] || { backgroundColor: '#F3F3F3', color: '#818CA9' }
},
/**
* 筛选表
*/
@ -205,7 +215,8 @@ const List = {
size: mescroll.size,
latitude: uni.getStorageSync('latitude') || import.meta.env.VITE_DEFAULT_LATITUDE,
longitude: uni.getStorageSync('longitude') || import.meta.env.VITE_DEFAULT_LONGITUDE,
search: keywords.value
search: keywords.value,
server_type: 0
}
getTeaSpecialist(filter).then((res: ITeaSpecialistResult) => {
@ -234,11 +245,11 @@ const List = {
handleToggleTeaSpecialistLevel: (value: any) => {
const index = selectedLevel.value.indexOf(value);
if (index > -1) {
// 如果已经选择了该等级,则取消选择
selectedLevel.value.splice(index, 1);
// 已选中时再次点击,取消选择
selectedLevel.value = [];
} else {
// 如果未选择该等级,则添加选择
selectedLevel.value.push(value);
// 单选:只保留当前点击项
selectedLevel.value = [value];
}
List.handleSearch()

View File

@ -255,7 +255,6 @@
{
"path": "package/detail",
"type": "page",
"needLogin": true,
"layout": "tabbar",
"style": {
"navigationStyle": "custom"

View File

@ -1,396 +1,408 @@
<route lang="jsonc" type="page">
{
<route lang="jsonc" type="page">{
"needLogin": true,
"layout": "default",
"style": {
"navigationStyle": "custom"
}
}
</route>
}</route>
<template>
<view>
<view>
<navbar title="收银台" custom-class='!bg-[#F6F7F8]' :leftArrow="false"></navbar>
</view>
<navbar title="收银台" custom-class='!bg-[#F6F7F8]' :leftArrow="false"></navbar>
</view>
<!-- 支付信息 -->
<view class="mt-56rpx text-center">
<view class="text-28rpx leading-40rpx text-#606266" v-if="!teaPackageTitle">{{ title }}</view>
<view class="text-28rpx leading-40rpx text-#606266" v-if="teaPackageTitle">茶艺师套餐-{{ teaPackageTitle }}</view>
<view class="text-28rpx leading-40rpx text-#606266" v-if="teaPackageTitle">茶艺师套餐-{{ teaPackageTitle }}
</view>
<view class="mt-24rpx">
<template>
<price-format color="#303133" :first-size="44" :second-size="44" :subscript-size="28" :price="money"></price-format>
<price-format color="#303133" :first-size="44" :second-size="44" :subscript-size="28"
:price="money"></price-format>
</template>
</view>
<view class="mt-12rpx flex items-center justify-center">
<view class="text-24rpx leading-34rpx text-#606266">
支付剩余时间
</view>
支付剩余时间
</view>
<wd-count-down :time="time" custom-class="!text-[#606266] !text-24rpx !leading-34rpx" />
</view>
</view>
<!-- 支付方式 -->
<view class="bg-white rounded-16rpx px-30rpx py-34rpx mx-30rpx mt-84rpx">
<view class="font-400 text-32rpx leading-44rpx text-#303133 border-b border-b-solid border-b-#F6F7F8 pb-16rpx mb-32rpx">支付方式</view>
<view
class="font-400 text-32rpx leading-44rpx text-#303133 border-b border-b-solid border-b-#F6F7F8 pb-16rpx mb-32rpx">
支付方式</view>
<!-- pay 组件 -->
<pay @pay="Cashier.handleGetPayValue" :hidePlatformBalance="hidePlatformBalance" :hideStoreBalance="hideStoreBalance" :hideWechat="hideWechat" :storeMoney="storeMoney"></pay>
<pay @pay="Cashier.handleGetPayValue" :hidePlatformBalance="hidePlatformBalance"
:hideStoreBalance="hideStoreBalance" :hideWechat="hideWechat" :storeMoney="storeMoney"></pay>
</view>
<view class="fixed bottom-70rpx left-0 right-0 text-#fff font-bold text-30rpx leading-42rpx mx-60rpx text-center rounded-8rpx w-630rpx" >
<wd-button custom-class='!bg-[#4C9F44] !rounded-8rpx !h-90rpx !leading-90rpx !w-630rpx' :disabled="isSubmitting" @click='Cashier.handleToPay'>{{ isGroupBuying ? '立即购买' : '立即预定' }}</wd-button>
<view
class="fixed bottom-70rpx left-0 right-0 text-#fff font-bold text-30rpx leading-42rpx mx-60rpx text-center rounded-8rpx w-630rpx">
<wd-button custom-class='!bg-[#4C9F44] !rounded-8rpx !h-90rpx !leading-90rpx !w-630rpx'
:disabled="isSubmitting" @click='Cashier.handleToPay'>{{ isGroupBuying ? '立即购买' : '立即预定' }}</wd-button>
</view>
</view>
</template>
<script lang="ts" setup>
import { getTeaSpecialistDetails } from '@/api/tea'
import { ITeaSpecialistDetailsFields } from '@/api/types/tea'
import { prePay, balancePay, newPrePay } from '@/api/pay'
import type {IUserInfoVo } from '@/api/types/login'
import { getTeaRoomBalance, getTeaRoomOrderDetail, getTeaRoomPackageOrderDetail, getTeaRoomPackageDetail, getTeaRoomPayOrderAmount, getRenewTeaRoomPayOrderAmount } from '@/api/tea-room'
import Pay from '@/components/Pay.vue'
import { PayValue, PayValueMap, PayOrderType, PayOrderSource } from '@/utils/pay'
import { toast } from '@/utils/toast'
import { router } from '@/utils/tools'
import { OrderType } from '@/utils/order'
import { wechatPay } from '@/hooks/usePay'
import { useUserStore } from '@/store'
import { getTeaSpecialistOrderDetails } from '@/api/teaSpecialist-order'
import { getTeaSpecialistDetails } from '@/api/tea'
import { ITeaSpecialistDetailsFields } from '@/api/types/tea'
import { prePay, balancePay, newPrePay } from '@/api/pay'
import type { IUserInfoVo } from '@/api/types/login'
import { getTeaRoomBalance, getTeaRoomOrderDetail, getTeaRoomPackageOrderDetail, getTeaRoomPackageDetail, getTeaRoomPayOrderAmount, getRenewTeaRoomPayOrderAmount } from '@/api/tea-room'
import Pay from '@/components/Pay.vue'
import { PayValue, PayValueMap, PayOrderType, PayOrderSource } from '@/utils/pay'
import { toast } from '@/utils/toast'
import { router } from '@/utils/tools'
import { OrderType } from '@/utils/order'
import { wechatPay } from '@/hooks/usePay'
import { useUserStore } from '@/store'
import { getTeaSpecialistOrderDetails } from '@/api/teaSpecialist-order'
// 用户信息
const userInfo = ref<IUserInfoVo>(null)
// 用户信息
const userInfo = ref<IUserInfoVo>(null)
// 支付倒计时取消
const time = ref<number>(3 * 60 * 1000)
// 支付倒计时取消
const time = ref<number>(3 * 60 * 1000)
// 支付金额
const money = ref<number>(0)
// 茶艺师详情
const id = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({
id: 0,
name: '',
star: 0,
image: '',
reservation_num: 0,
distance: 0,
speed: 0,
real: { gender: 1, both: 18, height: 165, weight: 53, interests: '爱好茶艺,喜欢旅游,把爱好当工作' },
teamasterlabel: [],
teamasterLevel: [],
price: 0,
fare_price: 0,
collect: 0,
up_status: 0,
textarea: []
})
// 支付金额
const money = ref<number>(0)
// 支付方式
const pay = ref<number>(0)
const hideWechat = ref<boolean>(false)
const hidePlatformBalance = ref<boolean>(false)
const hideStoreBalance = ref<boolean>(false)
// 茶艺师详情
const id = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({
id: 0,
name: '',
star: 0,
image: '',
reservation_num: 0,
distance: 0,
speed: 0,
real: { gender: 1, both: 18, height: 165, weight: 53, interests: '爱好茶艺,喜欢旅游,把爱好当工作' },
teamasterlabel: [],
teamasterLevel: [],
price: 0,
fare_price: 0,
collect: 0,
up_status: 0,
textarea: []
})
// 支付方式
const pay = ref<number>(0)
const hideWechat = ref<boolean>(false)
const hidePlatformBalance = ref<boolean>(false)
const hideStoreBalance = ref<boolean>(false)
// 订单
const orderId = ref<number>(0)
const order = ref<{}>(null)
const result = ref<string>('')
const from = ref<string>('')
// 支付标题
const title = ref<string>('')
// 门店ID
const storeId = ref<number>(0)
const storeMoney = ref<number>(0)
const comboId = ref<number>(0) // 套餐ID
// 一键续订支付
const renew = ref<string>('')
// 购买套餐支付
const isGroupBuying = ref<number>(0)
const groupCouponId = ref<number>(0)
// 只有在续订茶艺师下才有这个renewOrderId
const renewOrderId = ref<number>(0)
// 预约茶艺师支付
const reserveTeaSpecialist = ref<boolean>(false)
const teaSpecialistOrderAmount = ref<number>(0) // 茶艺师订单金额
// 茶艺师套餐标题
const teaPackageTitle = ref<string>('')
// 防止重复提交
const isSubmitting = ref(false)
onLoad(async (args) => {
// 订单
const orderId = ref<number>(0)
const order = ref<{}>(null)
const result = ref<string>('')
const from = ref<string>('')
orderId.value = Number(args.orderId)
comboId.value = Number(args.cmoboId) || 0
// 支付标题
const title = ref<string>('')
// 茶艺师套餐
teaPackageTitle.value = args.teaPackageTitle || ''
// 门店ID
const storeId = ref<number>(0)
const storeMoney = ref<number>(0)
const comboId = ref<number>(0) // 套餐ID
// 套餐购买
groupCouponId.value = Number(args.groupCouponId) || 0
isGroupBuying.value = Number(args.isGroupBuying) || 0
console.log("🚀 ~ isGroupBuying.value:", isGroupBuying.value)
// 一键续订支付
const renew = ref<string>('')
// 一键续订
renew.value = args?.renew || ''
// 购买套餐支付
const isGroupBuying = ref<number>(0)
const groupCouponId = ref<number>(0)
// 只有在续订茶艺师下才有这个renewOrderId
const renewOrderId = ref<number>(0)
// 预约茶艺师支付
const reserveTeaSpecialist = ref<boolean>(false)
const teaSpecialistOrderAmount = ref<number>(0) // 茶艺师订单金额
// 茶艺师套餐标题
const teaPackageTitle = ref<string>('')
// 防止重复提交
const isSubmitting = ref(false)
onLoad(async (args) => {
// 订单
orderId.value = Number(args.orderId)
comboId.value = Number(args.cmoboId) || 0
// 茶艺师套餐
teaPackageTitle.value = args.teaPackageTitle || ''
// 套餐购买
groupCouponId.value = Number(args.groupCouponId) || 0
isGroupBuying.value = Number(args.isGroupBuying) || 0
console.log("🚀 ~ isGroupBuying.value:", isGroupBuying.value)
// 一键续订
renew.value = args?.renew || ''
// 获取门店余额
if (args.storeId) {
storeId.value = Number(args.storeId)
const balance = await getTeaRoomBalance({ store_id: storeId.value })
storeMoney.value = Number(balance.data.money) || 0
}
// 设置支付来源标题
from.value = args.from || ''
if (from.value === OrderType.TeaRoomOrder) {
// 茶室订单:预定、套餐团购两种方式
if (args.name && isGroupBuying.value == 0) {
title.value = renew.value ? `茶室续订-${args.name}` : `茶室预定-${args.name}`
} else {
title.value = `茶室套餐购买-${args.name}`
hideStoreBalance.value = true // 隐藏门店余额支付
}
} else if (from.value === OrderType.TeaSpecialist) {
// 预约茶艺师
renewOrderId.value = args.renewOrderId
teaSpecialistOrderAmount.value = Number(args.teaSpecialistOrderAmount) || 0
reserveTeaSpecialist.value = true
if (renewOrderId.value > 0) {
title.value = `续订茶艺师-${args.teaSpecialistName || ''}`
} else {
title.value = `预订茶艺师-${args.teaSpecialistName || ''}`
}
// 获取门店余额
if (args.storeId) {
storeId.value = Number(args.storeId)
const balance = await getTeaRoomBalance({ store_id: storeId.value })
storeMoney.value = Number(balance.data.money) || 0
}
// 设置支付来源标题
from.value = args.from || ''
if (from.value === OrderType.TeaRoomOrder) {
// 茶室订单:预定、套餐团购两种方式
if (args.name && isGroupBuying.value == 0) {
title.value = renew.value ? `茶室续订-${args.name}` : `茶室预定-${args.name}`
} else {
title.value = `茶室套餐购买-${args.name}`
hideStoreBalance.value = true // 隐藏门店余额支付
}
} else if (from.value === OrderType.TeaSpecialist) {
// 预约茶艺师
renewOrderId.value = args.renewOrderId
teaSpecialistOrderAmount.value = Number(args.teaSpecialistOrderAmount) || 0
reserveTeaSpecialist.value = true
if (renewOrderId.value > 0) {
title.value = `续订茶艺师-${args.teaSpecialistName || ''}`
} else {
title.value = `预订茶艺师-${args.teaSpecialistName || ''}`
}
// 用户信息
const userStore = useUserStore()
userInfo.value = userStore.userInfo
hideStoreBalance.value = true // 隐藏门店余额支付
}
// 用户信息
const userStore = useUserStore()
userInfo.value = userStore.userInfo
// 获取订单详情
if (args.from == OrderType.TeaRoomOrder && args.orderId) {
// 获取订单详情
if (args.from == OrderType.TeaRoomOrder && args.orderId) {
// 获取订单详情
if (isGroupBuying.value == 0) {
// 茶室预约订单走这个接口,续订的不需要
if (renew.value) {
Cashier.handleGetRenewOrderDetails()
} else {
Cashier.handleGetOrderDetails()
}
if (isGroupBuying.value == 0) {
// 茶室预约订单走这个接口,续订的不需要
if (renew.value) {
Cashier.handleGetRenewOrderDetails()
} else {
Cashier.handleGetRoomPackageDetails(args.money)
Cashier.handleGetOrderDetails()
}
} else if (args.from == OrderType.TeaSpecialist && args.orderId) {
// 获取预定茶艺师订单详情
Cashier.handleGetTeaSpecialistOrderDetails()
} else {
Cashier.handleGetRoomPackageDetails(args.money)
}
})
} else if (args.from == OrderType.TeaSpecialist && args.orderId) {
// 获取预定茶艺师订单详情
Cashier.handleGetTeaSpecialistOrderDetails()
}
})
onUnload(() => {
switch(result.value) {
case 'success':
uni.$emit('payment', { result: true, orderId: orderId.value })
break;
case 'fail':
default: uni.$emit('payment', { result: false, orderId: orderId.value })
onUnload(() => {
switch (result.value) {
case 'success':
uni.$emit('payment', { result: true, orderId: orderId.value })
break;
case 'fail':
default: uni.$emit('payment', { result: false, orderId: orderId.value })
}
})
const Cashier = {
/**获取茶艺师订单详情
*
* @param id
* @param user_id
*/
handleGetTeaSpecialistOrderDetails: async () => {
const res = await getTeaSpecialistOrderDetails({
id: orderId.value
})
order.value = res
if (teaSpecialistOrderAmount.value > 0) {
money.value = teaSpecialistOrderAmount.value
} else {
money.value = Number(res.order_amount)
}
})
},
const Cashier = {
/**获取茶艺师订单详情
*
* @param id
* @param user_id
*/
handleGetTeaSpecialistOrderDetails: async () => {
const res = await getTeaSpecialistOrderDetails({
id: orderId.value
})
order.value = res
if (teaSpecialistOrderAmount.value > 0) {
money.value = teaSpecialistOrderAmount.value
/**
* 获取预定茶室订单详情
*/
handleGetOrderDetails: async () => {
// 获取订单详情接口
// const res = await getTeaRoomOrderDetail({
// id: orderId.value,
// latitude: uni.getStorageSync('latitude') || import.meta.env.VITE_DEFAULT_LATITUDE,
// longitude: uni.getStorageSync('longitude') || import.meta.env.VITE_DEFAULT_LONGITUDE,
// })
const res = await getTeaRoomPayOrderAmount({
id: orderId.value,
pay_way: pay.value || PayValue.PlatformBalance
})
console.log("🚀 ~ getTeaRoomPayOrderAmount res:", res)
order.value = res
money.value = Number(res.details.order_amount)
},
/**
* 获取茶室续订订单详情
*/
handleGetRenewOrderDetails: async () => {
const res = await getRenewTeaRoomPayOrderAmount({
id: orderId.value,
pay_way: pay.value || PayValue.PlatformBalance
})
console.log("🚀 ~ getRenewTeaRoomPayOrderAmount res:", res)
order.value = res
money.value = Number(res.details.order_amount)
},
/**
* 获取茶室套餐订单详情(改为args传过来金额)
* @param value
*/
handleGetRoomPackageDetails: async (m: number) => {
// const res = await getTeaRoomPackageDetail({
// id: comboId.value
// })
money.value = m
},
/**
* 获取支付方式
* @param value 支付value
*/
handleGetPayValue: (value: number) => {
pay.value = value
// 茶室订单:为了获取不同支付方式下的订单金额
if (from.value == OrderType.TeaRoomOrder && orderId.value && isGroupBuying.value == 0) {
if (renew.value) {
// 续订订单
Cashier.handleGetRenewOrderDetails()
} else {
money.value = Number(res.order_amount)
// 正常茶室订单
Cashier.handleGetOrderDetails()
}
},
}
},
/**
* 获取预定茶室订单详情
*/
handleGetOrderDetails: async () => {
// 获取订单详情接口
// const res = await getTeaRoomOrderDetail({
// id: orderId.value,
// latitude: uni.getStorageSync('latitude') || import.meta.env.VITE_DEFAULT_LATITUDE,
// longitude: uni.getStorageSync('longitude') || import.meta.env.VITE_DEFAULT_LONGITUDE,
// })
const res = await getTeaRoomPayOrderAmount({
id: orderId.value,
pay_way: pay.value || PayValue.PlatformBalance
})
console.log("🚀 ~ getTeaRoomPayOrderAmount res:", res)
order.value = res
money.value = Number(res.details.order_amount)
},
/**
* 支付
*/
handleToPay: async () => {
if (isSubmitting.value) return
/**
* 获取茶室续订订单详情
*/
handleGetRenewOrderDetails: async () => {
const res = await getRenewTeaRoomPayOrderAmount({
id: orderId.value,
pay_way: pay.value || PayValue.PlatformBalance
})
console.log("🚀 ~ getRenewTeaRoomPayOrderAmount res:", res)
order.value = res
money.value = Number(res.details.order_amount)
},
/**
* 获取茶室套餐订单详情(改为args传过来金额)
* @param value
*/
handleGetRoomPackageDetails: async (m: number) => {
// const res = await getTeaRoomPackageDetail({
// id: comboId.value
// })
money.value = m
},
if (pay.value == null || pay.value == undefined) {
toast.info('请选择支付方式')
return
}
/**
* 获取支付方式
* @param value 支付value
*/
handleGetPayValue: (value: number) => {
pay.value = value
isSubmitting.value = true
// 茶室订单:为了获取不同支付方式下的订单金额
if (from.value == OrderType.TeaRoomOrder && orderId.value && isGroupBuying.value == 0) {
if (renew.value) {
// 续订订单
Cashier.handleGetRenewOrderDetails()
} else {
// 正常茶室订单
Cashier.handleGetOrderDetails()
}
}
},
if (from.value == OrderType.TeaRoomOrder) {
// 预支付-茶室订单
uni.showLoading({ title: '支付中...' })
try {
// 预支付
const res = await prePay({
from: PayValueMap[pay.value],
order_id: orderId.value,
pay_way: pay.value,
order_source: PayOrderSource.MINI, //订单来源1-小程序; 2-h5; 3app
order_type: Cashier.handleGetOrderType(), // 0为茶艺师 1为茶室包间 2为茶室套餐
store_id: storeId.value || 0
})
/**
* 支付
*/
handleToPay: async () => {
if (isSubmitting.value) return
if (pay.value == null || pay.value == undefined) {
toast.info('请选择支付方式')
return
}
isSubmitting.value = true
if (from.value == OrderType.TeaRoomOrder) {
// 预支付-茶室订单
uni.showLoading({ title: '支付中...' })
try {
// 预支付
const res = await prePay({
from: PayValueMap[pay.value],
order_id: orderId.value,
pay_way: pay.value,
order_source: PayOrderSource.MINI, //订单来源1-小程序; 2-h5; 3app
order_type: Cashier.handleGetOrderType(), // 0为茶艺师 1为茶室包间 2为茶室套餐
store_id: storeId.value || 0
// 余额支付(平台余额、门店余额)
if (pay.value == PayValue.PlatformBalance || pay.value == PayValue.StoreBalance) {
await balancePay({
id: res.pay,
store_id: storeId.value || 0,
pay_way: pay.value,
})
// 余额支付(平台余额、门店余额)
if (pay.value == PayValue.PlatformBalance || pay.value == PayValue.StoreBalance) {
await balancePay({
id: res.pay,
store_id: storeId.value || 0,
pay_way: pay.value,
})
uni.hideLoading()
result.value = 'success'
uni.hideLoading()
isSubmitting.value = false
router.navigateBack(1, 500)
} else if (pay.value == PayValue.WeChatPay) {
// 微信支付
console.log("🚀 ~ res.pay:", res.pay)
if (res.pay_type && res.pay_type == 1) {
toast.success('支付成功')
result.value = 'success'
isSubmitting.value = false
router.navigateBack(1, 500)
} else if (pay.value == PayValue.WeChatPay) {
// 微信支付
console.log("🚀 ~ res.pay:", res.pay)
if (res.pay_type && res.pay_type == 1) {
toast.success('支付成功')
result.value = 'success'
return
} else {
wechatPay(res.pay.config).then((res) => {
console.log("🚀 ~ res:", res)
uni.hideLoading()
if (res === 'success') {
toast.success('支付成功')
result.value = 'success'
} else if (res === 'cancel') {
toast.info('已取消支付')
result.value = 'fail'
} else {
toast.info('支付失败,请重试')
result.value = 'fail'
}
isSubmitting.value = false
router.navigateBack(1, 500)
return
} else {
wechatPay(res.pay.config).then((res) => {
console.log("🚀 ~ res:", res)
uni.hideLoading()
if (res === 'success') {
toast.success('支付成功')
result.value = 'success'
} else if (res === 'cancel') {
toast.info('已取消支付')
result.value = 'fail'
} else {
toast.info('支付失败,请重试')
result.value = 'fail'
}
isSubmitting.value = false
router.navigateBack(1, 500)
return
}).catch((e) => {
console.log("🚀 ~ error:", e)
uni.hideLoading()
toast.info('支付失败,请重试')
return
})
}
}).catch((e) => {
console.log("🚀 ~ error:", e)
uni.hideLoading()
toast.info('支付失败,请重试')
return
})
}
} catch (error) {
isSubmitting.value = false
uni.hideLoading()
result.value = 'fail'
router.navigateBack(1, 500)
return
}
} else if (from.value == OrderType.TeaSpecialist) {
// 预支付-茶艺师订单
uni.showLoading({ title: '支付中...' })
try {
// 预支付
const res = await newPrePay({
from: PayValueMap[pay.value],
order_id: renewOrderId.value > 0 ? renewOrderId.value : orderId.value, //如果是续单的话则用续单的订单ID
pay_way: pay.value,
order_source: PayOrderSource.MINI, //订单来源1-小程序; 2-h5; 3app
order_type: renewOrderId.value > 0 ? PayOrderType.RenewTeaSpecialist : PayOrderType.TeaSpecialis, // 茶艺师订单
})
} catch (error) {
isSubmitting.value = false
uni.hideLoading()
result.value = 'fail'
router.navigateBack(1, 500)
return
}
} else if (from.value == OrderType.TeaSpecialist) {
// 预支付-茶艺师订单
uni.showLoading({ title: '支付中...' })
try {
// 预支付
const res = await newPrePay({
from: PayValueMap[pay.value],
order_id: renewOrderId.value > 0 ? renewOrderId.value : orderId.value, //如果是续单的话则用续单的订单ID
pay_way: pay.value,
order_source: PayOrderSource.MINI, //订单来源1-小程序; 2-h5; 3app
order_type: renewOrderId.value > 0 ? PayOrderType.RenewTeaSpecialist : PayOrderType.TeaSpecialis, // 茶艺师订单
})
// 余额支付(平台余额)
if (pay.value == PayValue.PlatformBalance && res) {
// 余额支付(平台余额)
if (pay.value == PayValue.PlatformBalance && res) {
uni.hideLoading()
uni.hideLoading()
result.value = 'success'
isSubmitting.value = false
router.navigateBack(1, 500)
} else if (pay.value == PayValue.WeChatPay) {
if (res.order_amount && Number(res.order_amount) == 0) {
toast.success('支付成功')
result.value = 'success'
isSubmitting.value = false
router.navigateBack(1, 500)
} else if (pay.value == PayValue.WeChatPay) {
return
} else {
// 微信支付
wechatPay(res.config).then((res) => {
uni.hideLoading()
@ -415,40 +427,41 @@
return
})
}
} catch (error) {
isSubmitting.value = false
uni.hideLoading()
result.value = 'fail'
router.navigateBack(1, 500)
return
}
}
},
/**
* 订单类型
*/
handleGetOrderType: () => {
if (isGroupBuying.value) {
// 购买团购套餐
return PayOrderType.BuyCombo
} else if (renew.value) {
// 续订包间
return PayOrderType.RenewRoom
} else if (reserveTeaSpecialist.value) {
// 预约茶艺师
return PayOrderType.TeaSpecialis
} else {
// 默认是购买茶室
return PayOrderType.TeaRoom
} catch (error) {
isSubmitting.value = false
uni.hideLoading()
result.value = 'fail'
router.navigateBack(1, 500)
return
}
}
},
/**
* 订单类型
*/
handleGetOrderType: () => {
if (isGroupBuying.value) {
// 购买团购套餐
return PayOrderType.BuyCombo
} else if (renew.value) {
// 续订包间
return PayOrderType.RenewRoom
} else if (reserveTeaSpecialist.value) {
// 预约茶艺师
return PayOrderType.TeaSpecialis
} else {
// 默认是购买茶室
return PayOrderType.TeaRoom
}
}
}
</script>
<style lang="scss">
page {
background-color: $cz-page-background;
}
page {
background-color: $cz-page-background;
}
</style>

View File

@ -86,10 +86,8 @@
</view>
<view class="px-12rpx mt-8rpx">
<view class="text-28rpx font-bold text-[#303133] line-1">{{ item.title }}</view>
<view class="text-[#FF5951] mt-6rpx flex items-baseline font-400">
<text class="text-28rpx">¥</text>
<text class="text-30rpx">{{ item.discount_price }}</text>
<text class="text-24rpx">/{{ item.hour }}小时</text>
<view class="text-[#FF5951] mt-6rpx font-400 w-180rpx">
<text class="text-30rpx block" style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">¥{{ item.discount_price }}/{{ item.hour }}小时</text>
</view>
</view>
</view>

View File

@ -98,22 +98,20 @@
return
}
uni.showLoading({
title: '登录中...',
mask: true
})
try {
const res = await userStore.wxLogin(Number(storeId.value))
console.log("🚀 ~ token:", uni.getStorageSync('token'))
uni.hideLoading()
uni.showLoading({ title: '登录中...', mask: true });
const res = await userStore.wxLogin(Number(storeId.value) || 0);
if (!res.mobile) {
showBindMobilePopup.value = true
return false
showBindMobilePopup.value = true;
toast.info('请先绑定手机号');
return;
}
Login.handleToLogin()
} catch(error) {
uni.hideLoading()
Login.handleToLogin();
} catch (error) {
console.error(error);
toast.info('登录失败,请重试');
} finally {
uni.hideLoading();
}
},