完善茶艺师套餐功能优化

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) { 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 longitude: number
level?: string level?: string
search?: string search?: string
server_type?: number // 1到店服务 2上门服务
} }
export function getTeaSpecialist(data: ITeaSpecialistParams) { export function getTeaSpecialist(data: ITeaSpecialistParams) {

View File

@ -26,7 +26,7 @@
<view> <view>
<view class="text-26rpx leading-32rpx text-#606266">公司名称</view> <view class="text-26rpx leading-32rpx text-#606266">公司名称</view>
<view class="mt-20rpx border-b border-b-solid border-b-[#F6F7F8] pb-20rpx"> <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> </view>
<view class="mt-22rpx"> <view class="mt-22rpx">
@ -38,7 +38,7 @@
<view class="mt-22rpx"> <view class="mt-22rpx">
<view class="text-26rpx leading-32rpx text-#606266">手机号</view> <view class="text-26rpx leading-32rpx text-#606266">手机号</view>
<view class="mt-20rpx border-b border-b-solid border-b-[#F6F7F8] pb-20rpx"> <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>
</view> </view>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,12 +1,10 @@
<route lang="jsonc" type="page"> <route lang="jsonc" type="page">{
{
"needLogin": true, "needLogin": true,
"layout": "default", "layout": "default",
"style": { "style": {
"navigationStyle": "custom" "navigationStyle": "custom"
} }
} }</route>
</route>
<template> <template>
<view> <view>
<view> <view>
@ -16,10 +14,12 @@
<!-- 支付信息 --> <!-- 支付信息 -->
<view class="mt-56rpx text-center"> <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">{{ 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"> <view class="mt-24rpx">
<template> <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> </template>
</view> </view>
<view class="mt-12rpx flex items-center justify-center"> <view class="mt-12rpx flex items-center justify-center">
@ -32,45 +32,50 @@
<!-- 支付方式 --> <!-- 支付方式 -->
<view class="bg-white rounded-16rpx px-30rpx py-34rpx mx-30rpx mt-84rpx"> <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 @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>
<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" > <view
<wd-button custom-class='!bg-[#4C9F44] !rounded-8rpx !h-90rpx !leading-90rpx !w-630rpx' :disabled="isSubmitting" @click='Cashier.handleToPay'>{{ isGroupBuying ? '立即购买' : '立即预定' }}</wd-button> 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>
</view> </view>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { getTeaSpecialistDetails } from '@/api/tea' import { getTeaSpecialistDetails } from '@/api/tea'
import { ITeaSpecialistDetailsFields } from '@/api/types/tea' import { ITeaSpecialistDetailsFields } from '@/api/types/tea'
import { prePay, balancePay, newPrePay } from '@/api/pay' import { prePay, balancePay, newPrePay } from '@/api/pay'
import type {IUserInfoVo } from '@/api/types/login' import type { IUserInfoVo } from '@/api/types/login'
import { getTeaRoomBalance, getTeaRoomOrderDetail, getTeaRoomPackageOrderDetail, getTeaRoomPackageDetail, getTeaRoomPayOrderAmount, getRenewTeaRoomPayOrderAmount } from '@/api/tea-room' import { getTeaRoomBalance, getTeaRoomOrderDetail, getTeaRoomPackageOrderDetail, getTeaRoomPackageDetail, getTeaRoomPayOrderAmount, getRenewTeaRoomPayOrderAmount } from '@/api/tea-room'
import Pay from '@/components/Pay.vue' import Pay from '@/components/Pay.vue'
import { PayValue, PayValueMap, PayOrderType, PayOrderSource } from '@/utils/pay' import { PayValue, PayValueMap, PayOrderType, PayOrderSource } from '@/utils/pay'
import { toast } from '@/utils/toast' import { toast } from '@/utils/toast'
import { router } from '@/utils/tools' import { router } from '@/utils/tools'
import { OrderType } from '@/utils/order' import { OrderType } from '@/utils/order'
import { wechatPay } from '@/hooks/usePay' import { wechatPay } from '@/hooks/usePay'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { getTeaSpecialistOrderDetails } from '@/api/teaSpecialist-order' 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 money = ref<number>(0)
// 茶艺师详情 // 茶艺师详情
const id = ref<number>(0) const id = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({ const info = reactive<ITeaSpecialistDetailsFields>({
id: 0, id: 0,
name: '', name: '',
star: 0, star: 0,
@ -86,48 +91,48 @@
collect: 0, collect: 0,
up_status: 0, up_status: 0,
textarea: [] textarea: []
}) })
// 支付方式 // 支付方式
const pay = ref<number>(0) const pay = ref<number>(0)
const hideWechat = ref<boolean>(false) const hideWechat = ref<boolean>(false)
const hidePlatformBalance = ref<boolean>(false) const hidePlatformBalance = ref<boolean>(false)
const hideStoreBalance = ref<boolean>(false) const hideStoreBalance = ref<boolean>(false)
// 订单 // 订单
const orderId = ref<number>(0) const orderId = ref<number>(0)
const order = ref<{}>(null) const order = ref<{}>(null)
const result = ref<string>('') const result = ref<string>('')
const from = ref<string>('') const from = ref<string>('')
// 支付标题 // 支付标题
const title = ref<string>('') const title = ref<string>('')
// 门店ID // 门店ID
const storeId = ref<number>(0) const storeId = ref<number>(0)
const storeMoney = ref<number>(0) const storeMoney = ref<number>(0)
const comboId = ref<number>(0) // 套餐ID const comboId = ref<number>(0) // 套餐ID
// 一键续订支付 // 一键续订支付
const renew = ref<string>('') const renew = ref<string>('')
// 购买套餐支付 // 购买套餐支付
const isGroupBuying = ref<number>(0) const isGroupBuying = ref<number>(0)
const groupCouponId = ref<number>(0) const groupCouponId = ref<number>(0)
// 只有在续订茶艺师下才有这个renewOrderId // 只有在续订茶艺师下才有这个renewOrderId
const renewOrderId = ref<number>(0) const renewOrderId = ref<number>(0)
// 预约茶艺师支付 // 预约茶艺师支付
const reserveTeaSpecialist = ref<boolean>(false) const reserveTeaSpecialist = ref<boolean>(false)
const teaSpecialistOrderAmount = ref<number>(0) // 茶艺师订单金额 const teaSpecialistOrderAmount = ref<number>(0) // 茶艺师订单金额
// 茶艺师套餐标题 // 茶艺师套餐标题
const teaPackageTitle = ref<string>('') const teaPackageTitle = ref<string>('')
// 防止重复提交 // 防止重复提交
const isSubmitting = ref(false) const isSubmitting = ref(false)
onLoad(async (args) => { onLoad(async (args) => {
// 订单 // 订单
orderId.value = Number(args.orderId) orderId.value = Number(args.orderId)
comboId.value = Number(args.cmoboId) || 0 comboId.value = Number(args.cmoboId) || 0
@ -195,19 +200,19 @@
// 获取预定茶艺师订单详情 // 获取预定茶艺师订单详情
Cashier.handleGetTeaSpecialistOrderDetails() Cashier.handleGetTeaSpecialistOrderDetails()
} }
}) })
onUnload(() => { onUnload(() => {
switch(result.value) { switch (result.value) {
case 'success': case 'success':
uni.$emit('payment', { result: true, orderId: orderId.value }) uni.$emit('payment', { result: true, orderId: orderId.value })
break; break;
case 'fail': case 'fail':
default: uni.$emit('payment', { result: false, orderId: orderId.value }) default: uni.$emit('payment', { result: false, orderId: orderId.value })
} }
}) })
const Cashier = { const Cashier = {
/**获取茶艺师订单详情 /**获取茶艺师订单详情
* *
* @param id * @param id
@ -391,6 +396,13 @@
isSubmitting.value = false isSubmitting.value = false
router.navigateBack(1, 500) router.navigateBack(1, 500)
} else if (pay.value == PayValue.WeChatPay) { } 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)
return
} else {
// 微信支付 // 微信支付
wechatPay(res.config).then((res) => { wechatPay(res.config).then((res) => {
uni.hideLoading() uni.hideLoading()
@ -415,6 +427,7 @@
return return
}) })
} }
}
} catch (error) { } catch (error) {
isSubmitting.value = false isSubmitting.value = false
uni.hideLoading() uni.hideLoading()
@ -443,12 +456,12 @@
return PayOrderType.TeaRoom return PayOrderType.TeaRoom
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss">
page { page {
background-color: $cz-page-background; background-color: $cz-page-background;
} }
</style> </style>

View File

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

View File

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