完善接口

This commit is contained in:
wangxiaowei
2025-11-03 18:36:50 +08:00
parent 3465804793
commit ac8212c8f0
19 changed files with 845 additions and 352 deletions

42
src/api/order.ts Normal file
View File

@ -0,0 +1,42 @@
import { http } from '@/http/alova'
import type { IOrderListResult, IOrderDetailsResult } from '@/api/types/order'
/**
* 获取订单列表
*/
export interface ITeaSpecialistOrderListParams {
page: number
size: number
order_status: string
search: string
}
export function getTeaSpecialistOrderList(data: ITeaSpecialistOrderListParams) {
return http.Post<IOrderListResult>('/api/order/orderList',
data
)
}
/**
* 获取订单详情
*/
export interface ITeaSpecialistOrderDetailsParams {
id: number
}
export function getTeaSpecialistOrderDetails(data: ITeaSpecialistOrderDetailsParams) {
return http.Post<IOrderDetailsResult>('/api/order/orderDetails',
data
)
}
/**
* 取消订单
*/
export interface ICancelTeaSpecialistOrderParams {
id: number
}
export function cancelTeaSpecialistOrder(data: ICancelTeaSpecialistOrderParams) {
return http.Post('/api/order/cancelOrder',
data
)
}

View File

@ -1,5 +1,12 @@
import { http } from '@/http/alova'
import type { ITeaSpecialistDetailsResult, ITeaSpecialistFuture7DaysResult, ITeaTypeListResult, ICollectTeaSpecialistResult } from '@/api/types/tea'
import type {
ITeaSpecialistDetailsResult,
ITeaSpecialistFuture7DaysResult,
ITeaTypeListResult,
ICollectTeaSpecialistResult,
ICreateTeaSpecialistOrderResult,
ITeaSpecialistOrderDetailsResult,
ITeaSpecialistPrepayResult } from '@/api/types/tea'
/**
* 获取茶艺师详情
@ -44,7 +51,6 @@ export function getTeaSpecialistRewardAmounts() {
/**
* 获取门店地址
*/
export interface ITeaHouseListParams {
page: number
size: number
@ -84,3 +90,94 @@ export interface IGetCollectTeaSpecialistParams {
export function getCollect(data: IGetCollectTeaSpecialistParams) {
return http.Post<ICollectTeaSpecialistResult>('/api/Teamaster/teamasterCollectList', data)
}
/**
* 茶艺师邀约
*/
export interface ITeaSpecialistInviteParams {
id: number
}
export function teaSpecialistInvite(data: ITeaSpecialistInviteParams) {
return http.Post('/api/Teamaster/invitation', data)
}
/**
* 创建预约茶艺师订单
*/
export interface ICreateTeaSpecialistOrderParams {
teamaster_id: number
address_id: number
start_time: number
end_time: number
nums: number
tea_id: string
service_type: number
store_id: number
latitude: number
longitude: number
remark: string
coupon_id: number
hours: number
}
export function createTeaSpecialistOrder(data: ICreateTeaSpecialistOrderParams) {
return http.Post<ICreateTeaSpecialistOrderResult>('/api/order/submitOrder', data)
}
/***
* 获取订单详情
*/
export interface IGetTeaSpecialistOrderDetailsParams {
id: number
}
export function getTeaSpecialistOrderDetails(data: IGetTeaSpecialistOrderDetailsParams) {
return http.Post<ITeaSpecialistOrderDetailsResult>('/api/order/orderDetails', data)
}
/**
* 预支付
*/
export interface ITeaSpecialistPrepayParams {
order_id: number
from: string
pay_way: number
order_source: number
}
export function teaSpecialistPrepay(data: ITeaSpecialistPrepayParams) {
return http.Post<ITeaSpecialistPrepayResult>('/api/pay/prepay', data)
}
/**
* 支付接口
*/
export interface ITeaSpecialistPayParams {
id: number
}
export function teaSpecialistPay(data: ITeaSpecialistPayParams) {
return http.Post('/api/pay/yuePay', data)
}
/**
* 团体预约
*/
export interface ITeaSpecialistGroupReserveParams {
numbers: string
other_require: string
res_time: string
contact: string
phone: string
code: string
province: string
city: string
district: string
address: string
content: string
}
export function teaSpecialistGroupReserve(data: ITeaSpecialistGroupReserveParams) {
return http.Post('/api/Teamaster/groupReservation', data)
}

17
src/api/types/order.ts Normal file
View File

@ -0,0 +1,17 @@
/**
* 订单列表返回数据
*/
export interface IOrderListResult {
count: number
list: Array<any>
more: number
page: string
size: string
}
/**
* 订单详情返回数据
*/
export interface IOrderDetailsResult {
details: any
}

View File

@ -9,6 +9,7 @@ export interface ITeaSpecialistDetailsResult {
* 茶艺师详情字段
*/
export interface ITeaSpecialistDetailsFields {
id: 0,
name: string
star: number
image: string
@ -27,6 +28,7 @@ export interface ITeaSpecialistDetailsFields {
price: number
fare_price: number
collect: number
up_status: number
}
/**
@ -78,4 +80,34 @@ export interface ICollectTeaSpecialistResult {
more: Number
page: string
size: string
}
/**
* 创建订单返回id
*/
export interface ICreateTeaSpecialistOrderResult {
id: number
}
/**
* 订单详情返回结果
*/
export interface ITeaSpecialistOrderDetailsResult {
details: {
order_amount: string
order_sn: string
}
}
/**
* 预支付返回结果
*/
export interface ITeaSpecialistPrepayResult {
pay_id: number
}
/**
* 支付返回结果
*/
export interface ITeaSpecialistPayResult {
}

View File

@ -91,9 +91,9 @@
couponType.value = args.type
}
if (args.id && args.time) {
if (args.id && args.numbers) {
// 获取到茶艺师ID和预定了几个小时
Coupons.handleInit(args.id, args.time)
Coupons.handleInit(args.id, args.numbers)
}
})

View File

@ -40,7 +40,7 @@
<view v-for="item in teaList" :key="item.id"
class="h-110rpx rounded-16rpx flex flex-col items-center justify-center text-28rpx leading-40rpx"
:class="selectedRenewTea.includes(item.id) ? 'bg-[#4C9F44] text-[#fff]' : 'bg-[#F7F7F7] text-[#606266]'"
@click="orderDetail.handleToggleRenewTea(item.id)">
@click="OrderDetail.handleToggleRenewTea(item.id)">
<view>{{item.title}}</view>
<view>{{item.price}}</view>
</view>
@ -116,7 +116,7 @@
<view class="mt-54rpx text-32rpx leading-44rpx flex items-center justify-center leading-80rpx text-center">
<view class="w-240rpx h-80rpx bg-[#F6F7F8] rounded-8rpx text-[#303133] mr-30rpx" @click="showRefundRule = false">取消</view>
<view class="w-240rpx h-80rpx bg-[#4C9F44] rounded-8rpx text-[#fff]" @click="orderDetail.handleConfirmRefund">确定退款</view>
<view class="w-240rpx h-80rpx bg-[#4C9F44] rounded-8rpx text-[#fff]" @click="OrderDetail.handleConfirmRefund">确定退款</view>
</view>
</view>
</wd-popup>
@ -206,54 +206,53 @@
</view>
</wd-popup>
<!-- 平台团购直营店 -->
<view>
<navbar :title="title" custom-class='!bg-[#F6F7F8]'></navbar>
<navbar :title="title" custom-class='!bg-[#F6F7F8]' :leftArrow="false"></navbar>
</view>
<view class="text-[#909399] text-26rpx leading-36rpx mb-40rpx">
<view class="ml-80rpx" v-if="orderStatus === OrderStatus.Consuming || orderStatus === OrderStatus.Reserved || orderStatus === OrderStatus.Serving">使用过程中有任何问题,请联系客服</view>
<view class="flex items-center justify-center" v-if="orderStatus === OrderStatus.Pending">
<view class="ml-80rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Serving || orderStatus == TeaSpecialistOrderStatus.Pay">使用过程中有任何问题,请联系客服</view>
<view class="flex items-center justify-center" v-if="orderStatus == TeaSpecialistOrderStatus.Pending">
<view class="flex items-center mr-6rpx">
<wd-img width="36rpx" height="36rpx" :src="`${OSS}icon/icon_time.png`"/>
</view>
<view class="flex items-center text-26rpx leading-36rpx text-[#909399]">
<view>还剩</view>
<view class="mx-6rpx">
<wd-count-down :time="time" custom-class="!text-[#FF5951]" />
<wd-count-down :time="order.time1" custom-class="!text-[#FF5951]" />
</view>
<view>订单自动取消</view>
</view>
</view>
<view class="ml-80rpx" v-if="orderStatus === OrderStatus.Finished">品一口香茗,让生活慢下来,从一杯好茶开始</view>
<view class="ml-80rpx" v-if="orderStatus === OrderStatus.Confirm">您的服务已经结束,请及时确认订单</view>
<view class="ml-80rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Finished">感谢您的选择,期待再续茶香!</view>
<view class="ml-80rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Confirm">您的服务已经结束,请及时确认订单</view>
</view>
<!-- 信息模块 -->
<view class="mx-30rpx coupon-bg" >
<view class="flex items-center px-30rpx pt-30rpx pb-40rpx">
<view class="mr-30rpx">
<wd-img width="190rpx" height="190rpx" :src="`${OSS}images/home/home_image5.png`" mode="scaleToFill"></wd-img>
<wd-img width="190rpx" height="190rpx" :src="order.teamaster.image" mode="scaleToFill"></wd-img>
</view>
<view class="flex-1">
<view class="flex justify-between items-center">
<view class="font-bold text-30rpx leading-42rpx text-[#303133] mr-10rpx line-1 w-300rpx">
茶艺师名称
{{ order.teamaster.name }}
<wd-icon name="chevron-right" size="32rpx"></wd-icon>
</view>
<view class="text-26rpx leading-36rpx text-[#909399]">¥324</view>
<view class="text-26rpx leading-36rpx text-[#909399]">¥{{ order.order_amount }}</view>
</view>
<view class="flex justify-between items-center text-26rpx leading-36rpx text-[#909399] mt-18rpx">
<view>¥108/小时</view>
<view>x3</view>
<view>¥{{ order.teamaster.price }}/小时</view>
<view>x{{ order.hours }}</view>
</view>
<view class="flex justify-between items-center text-26rpx leading-36rpx text-[#909399] mt-18rpx">
<view>车马费(¥3.00元/公里)</view>
<view>x3</view>
<view>车马费(¥{{ order.fare_price }}元/公里)</view>
<view>¥{{ order.fare_distance_price }}/小时</view>
</view>
<view class="text-[#606266] text-right mt-26rpx" v-if="orderStatus !== OrderStatus.Pending">
<view class="text-[#606266] text-right mt-26rpx" v-if="orderStatus !== TeaSpecialistOrderStatus.Pending">
<text class="text-24rpx leading-34rpx mr-12rpx">实付</text>
<text class="tetx-32rpx leading-36rpx">¥29.32</text>
<text class="tetx-32rpx leading-36rpx">¥{{ order.order_amount }}</text>
<wd-icon name="chevron-right" size="32rpx"></wd-icon>
</view>
</view>
@ -262,11 +261,11 @@
<view class="mt-28rpx pb-28rpx">
<view class="text-30rpx leading-42rpx text-[#303133] px-30rpx">预约信息</view>
<view class="font-500 text-26rpx leading-48rpx text-[#606266] mt-20rpx">
<view class="mb-20rpx px-30rpx">预约时间:2025-03-18 09:00-12:00</view>
<view class="mb-20rpx px-30rpx">预约时间:{{ order.start_time }} - {{ order.end_time }}</view>
<view class="flex justify-between items-center pl-30rpx">
<view>预约时长3小时</view>
<view
v-if="orderStatus === OrderStatus.Reserved || orderStatus === OrderStatus.Consuming"
v-if="orderStatus == TeaSpecialistOrderStatus.Reserved || orderStatus == TeaSpecialistOrderStatus.Consuming"
class="bg-[#4C9F44] rounded-[100rpx_0rpx_0rpx_100rpx] font-bold text-28rpx leading-40rpx text-[#fff] w-170rpx h-56rpx flex justify-center items-center"
@click="showRenewPopup = true">一键续订</view>
</view>
@ -275,7 +274,7 @@
</view>
<!-- 地图显示 -->
<view class="mx-30rpx mt-20rpx bg-white rounded-16rpx" v-if="orderStatus === OrderStatus.Serving || orderStatus === OrderStatus.Reserved">
<view class="mx-30rpx mt-20rpx bg-white rounded-16rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Serving || orderStatus == TeaSpecialistOrderStatus.Reserved">
<view class="px-30rpx"> 地图显示</view>
<view class="px-30rpx flex justify-between items-center">
<view class="font-500 text-24rpx text-[#909399] leading-42rpx">信息没有更新,想问问茶艺师到哪里了?</view>
@ -298,14 +297,14 @@
<view>
<view class="text-28rpx leading-40rpx flex items-center mt-22rpx">
<view class="text-[#606266] mr-54rpx">服务方式</view>
<view class="text-[#303133]">到店服务</view>
<view class="text-[#303133]">{{ order.service_type }}</view>
</view>
<view class="text-28rpx leading-40rpx flex items-center mt-22rpx" v-if="orderStatus !== OrderStatus.Pending">
<view class="text-28rpx leading-40rpx flex items-center mt-22rpx" v-if="orderStatus !== TeaSpecialistOrderStatus.Pending">
<view class="text-[#606266] mr-54rpx">服务门店</view>
<view class="text-[#303133] line-1 w-300rpx">茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称</view>
<view class="text-[#303133] line-1 w-300rpx">{{ order.store_address }}</view>
</view>
<view class="text-28rpx leading-40rpx flex items-center mt-22rpx">
<view class="text-[#606266] mr-54rpx"> {{ orderStatus === OrderStatus.Serving ? '门店地址' : '服务地址' }}</view>
<view class="text-[#606266] mr-54rpx"> {{ orderStatus === TeaSpecialistOrderStatus.Serving ? '门店地址' : '服务地址' }}</view>
<view class="text-[#303133]">青浦区仓桥路478号</view>
</view>
</view>
@ -313,7 +312,7 @@
<view class="text-center mr-20rpx" >
<wd-img width="64rpx" height="64rpx" :src="`${OSS}icon/icon_nav.png`"/>
</view>
<view class="text-center" v-if="orderStatus === OrderStatus.Serving">
<view class="text-center" v-if="orderStatus === TeaSpecialistOrderStatus.Serving">
<wd-img width="64rpx" height="64rpx" :src="`${OSS}icon/icon_phone.png`"/>
</view>
</view>
@ -322,7 +321,7 @@
</view>
<!-- 支付方式 -->
<view class="bg-white rounded-16rpx px-30rpx py-34rpx mx-30rpx mt-20rpx" v-if="orderStatus === OrderStatus.Pending">
<view class="bg-white rounded-16rpx px-30rpx py-34rpx mx-30rpx mt-20rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Pending">
<wd-radio-group v-model="pay" shape="dot" checked-color="#4C9F44">
<block v-for="(item, index) in PayList" :key="index">
<view
@ -336,7 +335,7 @@
</view>
<view class="flex items-center">
<wd-radio :value="item.value">
<view class="text-[#303133] text-26rpx leading-36rpx mr-20rpx" v-if="item.type !== PayCategory.WeChatPay">可用202.22</view>
<view class="text-[#303133] text-26rpx leading-36rpx mr-20rpx" v-if="item.type != PayCategory.WeChatPay">可用202.22</view>
</wd-radio>
</view>
</view>
@ -350,22 +349,22 @@
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>订单编号</view>
<view>
<text>7327328627526903</text>
<text>{{ order.order_sn }}</text>
<wd-divider vertical />
<text class="text-[#4C9F44]">复制</text>
<text class="text-[#4C9F44]" @click="OrderDetail.handleCopy(order.order_sn)">复制</text>
</view>
</view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx" v-if="orderStatus !== OrderStatus.Pending">
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx" v-if="orderStatus != TeaSpecialistOrderStatus.Pending">
<view>交易方式</view>
<view>微信支付</view>
<view>{{ PayValueText[order.pay_way] }}</view>
</view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>创建时间</view>
<view>2019-05-16 12:20:26</view>
<view>{{ order.dtime }}</view>
</view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx" v-if="orderStatus !== OrderStatus.Pending">
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx" v-if="orderStatus != TeaSpecialistOrderStatus.Pending">
<view>付款时间</view>
<view>2019-05-16 13:20:26</view>
<view>{{ order.update_dtime }}</view>
</view>
</view>
@ -373,15 +372,15 @@
<view class="w-full fixed bottom-0 left-0 right-0 bg-white h-152rpx">
<view class="mt-34rpx">
<!-- 预约单服务中 -->
<view class="text-32rpx leading-44rpx flex items-center justify-center leading-90rpx text-center" v-if="orderStatus === OrderStatus.Serving || orderStatus === OrderStatus.Confirm">
<view class="w-330rpx h-90rpx bg-[#F6F7F8] rounded-8rpx text-[#303133] mr-30rpx" @click="orderDetail.handleAgainReeserve">再次预定</view>
<view class="w-330rpx h-90rpx bg-[#4C9F44] rounded-8rpx text-[#fff]" @click="orderDetail.handleConfirmOrder">确认订单</view>
<view class="text-32rpx leading-44rpx flex items-center justify-center leading-90rpx text-center" v-if="orderStatus === TeaSpecialistOrderStatus.Serving || orderStatus == TeaSpecialistOrderStatus.Confirm">
<view class="w-330rpx h-90rpx bg-[#F6F7F8] rounded-8rpx text-[#303133] mr-30rpx" @click="OrderDetail.handleAgainReeserve">再次预定</view>
<view class="w-330rpx h-90rpx bg-[#4C9F44] rounded-8rpx text-[#fff]" @click="OrderDetail.handleConfirmOrder">确认订单</view>
</view>
<!-- 待付款 -->
<view class="flex items-center justify-between mx-58rpx mt-34rpx" v-if="orderStatus === OrderStatus.Pending">
<view class="flex items-center justify-between mx-58rpx mt-34rpx" v-if="orderStatus == TeaSpecialistOrderStatus.Pending">
<view class="flex items-center">
<view class="text-28rpx leading-40rpx text-[#606266] mr-16rpx" @click="orderDetail.handleCancelOrder">取消</view>
<view class="text-28rpx leading-40rpx text-[#606266] mr-16rpx" @click="OrderDetail.handleCancelOrder">取消</view>
<view class="flex items-center">
<view class="mr-16rpx mt-[-8rpx]">
<price-format color="#FF5951" :first-size="40" :second-size="40" :subscript-size="28" :price="23.02"></price-format>
@ -396,14 +395,14 @@
</view>
<!-- 已预约 -->
<view class="text-32rpx leading-44rpx flex items-center justify-center leading-90rpx text-center" v-if="orderStatus === OrderStatus.Reserved">
<view class="text-32rpx leading-44rpx flex items-center justify-center leading-90rpx text-center" v-if="orderStatus == TeaSpecialistOrderStatus.Reserved">
<view class="w-330rpx h-90rpx bg-[#F6F7F8] rounded-8rpx text-[#303133] mr-30rpx" @click="showRefundRule = true">申请退款</view>
<view class="w-330rpx h-90rpx bg-[#F6F7F8] rounded-8rpx text-[#303133]" @click="orderDetail.handleService">联系客服</view>
<view class="w-330rpx h-90rpx bg-[#F6F7F8] rounded-8rpx text-[#303133]" @click="OrderDetail.handleService">联系客服</view>
</view>
<!-- 交易完成 -->
<view class="text-32rpx leading-44rpx flex items-center justify-center leading-90rpx text-center mt-34rpx"
v-if="orderStatus === OrderStatus.Finished || orderStatus === OrderStatus.Cancelled">
v-if="orderStatus == TeaSpecialistOrderStatus.Finished || orderStatus == TeaSpecialistOrderStatus.Cancelled">
<view class="w-630rpx h-90rpx bg-[#4C9F44] rounded-8rpx text-[#fff]">再次预定</view>
</view>
</view>
@ -413,15 +412,16 @@
</template>
<script lang="ts" setup>
import { OrderStatusTitle, OrderStatus, OrderSource } from '@/utils/order'
import {toast} from '@/utils/toast'
import { OrderStatusTitle, OrderStatus, OrderSource, TeaSpecialistOrderStatusTextValue, TeaSpecialistOrderStatus } from '@/utils/order'
import { getTeaSpecialistOrderDetails } from '@/api/order'
import { toast } from '@/utils/toast'
import { useMessage } from 'wot-design-uni'
import { PayList, PayCategory, PayValue } from '@/utils/pay'
import { PayList, PayCategory, PayValue, PayValueText } from '@/utils/pay'
const OSS = inject('OSS')
const title = ref<string>('')
const orderStatus = ref<string>('') // 订单状态:待使用、退款等
const orderStatus = ref<number>(0) // 订单状态:待使用、退款等
const showRefundRule = ref<boolean>(false) // 退款规则弹窗
// 订单倒计时取消
@ -470,17 +470,29 @@
{id: 5, title: '红茶(3泡)', price: '¥128.00'},
]
const selectedRenewTea = ref<Array<any>>([]) // 选择的续订时间
const showRenewSuccessPopup = ref<boolean>(false)
/** 结束 **/
onLoad((args) => {
title.value = OrderStatusTitle[OrderSource.TeaSpecialist][args.orderStatus] || '订单详情'
orderStatus.value = args.orderStatus
// 订单ID
const orderId = ref<number>(0)
const order = ref<any>({})
onLoad(async (args) => {
orderId.value = args.orderId
// 获取订单详情
OrderDetail.handleInit()
})
const orderDetail = {
const OrderDetail = {
// 获取订单详情
handleInit: async () => {
const res = await getTeaSpecialistOrderDetails({id: orderId.value})
const data = res.details
order.value = data
title.value = TeaSpecialistOrderStatusTextValue[data.order_status].title || '订单详情'
orderStatus.value = data.order_status
},
// 确认订单
handleConfirmOrder: () => {
message.confirm({
@ -547,6 +559,16 @@
handleService: () => {
},
handleCopy: (text: string) => {
uni.setClipboardData({
data: text,
success: () => {
toast.info('复制成功')
}
})
}
}
</script>

View File

@ -8,25 +8,22 @@
<template>
<view class="">
<view class="order-list sticky top-0 left-0 z-50 bg-[#F6F7F8] pb-10rpx">
<wd-navbar safeAreaInsetTop custom-class='!bg-[#F6F7F8]' :bordered="false" placeholder @click-left="orderList.handleBack">
<wd-navbar safeAreaInsetTop custom-class='!bg-[#F6F7F8]' :bordered="false" placeholder :leftArrow="false">
<template #left>
<view class="h-48rpx flex items-center">
<view class="mt-4rpx">
<wd-icon name="thin-arrow-left" size="30rpx"></wd-icon>
</view>
<view class="search-box">
<wd-search v-model="keywords" hide-cancel placeholder-left light placeholder="搜索茶室订单"></wd-search>
<view class="h-48rpx flex items-center w-[100%]">
<view class="search-box w-[100%]">
<wd-search v-model="keywords" placeholder-left light placeholder="搜索茶室订单"></wd-search>
</view>
</view>
</template>
</wd-navbar>
<view class="tabs">
<wd-tabs v-model="tab" swipeable slidable="always" :lazy="false" @click="orderList.handleChangeTabs">
<wd-tab title="全部" name="all"></wd-tab>
<wd-tab title="待付款" :name="OrderStatus.Pending"></wd-tab>
<wd-tab title="预约单" :name="OrderStatus.Reserved"></wd-tab>
<wd-tab title="待确认" :name="OrderStatus.Confirm"></wd-tab>
<wd-tab title="已完结" :name="OrderStatus.Finished"></wd-tab>
<wd-tab title="全部" :name="TeaSpecialistOrderStatusText.All"></wd-tab>
<wd-tab title="待付款" :name="TeaSpecialistOrderStatusText.Pending"></wd-tab>
<wd-tab title="预约单" :name="TeaSpecialistOrderStatusText.Pay"></wd-tab>
<wd-tab title="待确认" :name="TeaSpecialistOrderStatusText.Confirm"></wd-tab>
<wd-tab title="已完结" :name="TeaSpecialistOrderStatusText.Finished"></wd-tab>
</wd-tabs>
</view>
</view>
@ -34,37 +31,37 @@
<view class="tabs mt-18rpx mx-30rpx">
<!-- 这里可以尝试下不重新刷新获取列表 -->
<!-- 全部 -->
<mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" v-if="tab === 'all'">
<view class="mb-20rpx" v-for="(item, index) in 10" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order-status="OrderStatus.Pending"></combo-card>
<mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" :down="downOption" :up="upOption" v-if="tab === 'all'">
<view class="mb-20rpx" v-for="(item, index) in list" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order="item"></combo-card>
</view>
</mescroll-body>
<!-- 待付款 -->
<mescroll-body ref="mescrollItem1" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" v-if="tab === OrderStatus.Pending">
<view class="mb-20rpx" v-for="(item, index) in 10" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order-status="OrderStatus.Pending"></combo-card>
<mescroll-body ref="mescrollItem1" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" :down="downOption" :up="upOption" v-if="tab === OrderStatus.Pending">
<view class="mb-20rpx" v-for="(item, index) in list" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order="item"></combo-card>
</view>
</mescroll-body>
<!-- 预约单 -->
<mescroll-body ref="mescrollItem2" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" v-if="tab === OrderStatus.Reserved">
<view class="mb-20rpx" v-for="(item, index) in 10" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order-status="OrderStatus.Pending"></combo-card>
<mescroll-body ref="mescrollItem2" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" :down="downOption" :up="upOption" v-if="tab === OrderStatus.Reserved">
<view class="mb-20rpx" v-for="(item, index) in list" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order="item"></combo-card>
</view>
</mescroll-body>
<!-- 待确认 -->
<mescroll-body ref="mescrollItem2" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" v-if="tab === OrderStatus.Confirm">
<view class="mb-20rpx" v-for="(item, index) in 10" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order-status="OrderStatus.Pending"></combo-card>
<mescroll-body ref="mescrollItem2" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" :down="downOption" :up="upOption" v-if="tab === OrderStatus.Confirm">
<view class="mb-20rpx" v-for="(item, index) in list" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order="item"></combo-card>
</view>
</mescroll-body>
<!-- 已完结 -->
<mescroll-body ref="mescrollItem3" @init="mescrollInit" @down="downCallback" @up="orderList.upCallback" v-if="tab === OrderStatus.Finished">
<view class="mb-20rpx" v-for="(item, index) in 10" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order-status="OrderStatus.Pending"></combo-card>
<view class="mb-20rpx" v-for="(item, index) in list" :key="index">
<combo-card :type="OrderSource.TeaSpecialist" :order="item"></combo-card>
</view>
</mescroll-body>
</view>
@ -74,18 +71,26 @@
<script lang="ts" setup>
import { OrderSource, OrderStatus } from '@/utils/order'
import { getTeaSpecialistOrderList } from '@/api/order'
import ComboCard from '@/components/order/ComboCard.vue'
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js"
import { TeaSpecialistOrderStatusText, TeaSpecialistOrderStatusValue } from '@/utils/order'
/* mescroll */
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook
// 店铺类型
// 搜索
const downOption = {
auto: true
}
const upOption = {
auto: true,
textNoMore: '~ 已经到底啦 ~', //无更多数据的提示
}
const list = ref<Array<any>>([]) // 茶艺师列表
const keywords = ref<string>('')
const orderStatus = ref<string>('')
// tab
const tab = ref<string>('all')
@ -99,50 +104,36 @@
const orderList = {
// 上拉加载的回调: 其中num:当前页 从1开始, size:每页数据条数,默认10
upCallback: (mescroll) => {
// 需要留一下数据为空的时候显示的空数据图标内容
// list({
// page: mescroll.num,
// size: mescroll.size
// }).then((res: { list: Array<any>, totalPages: Number }) => {
// const curPageData = res.list || [] // 当前页数据
// if(mescroll.num == 1) goods.value = []; // 第一页需手动制空列表
// goods.value = goods.value.concat(curPageData); //追加新数据
const filter = {
page: mescroll.num,
size: mescroll.size,
order_status: orderStatus.value,
search: keywords.value
}
console.log('filter:', filter)
// console.log("🚀 ~ goods:", goods)
// mescroll.endByPage(curPageData.length, res.totalPages); //必传参数(当前页的数据个数, 总页数)
// }).catch(() => {
// mescroll.endErr(); // 请求失败, 结束加载
// })
// apiGoods(mescroll.num, mescroll.size).then(res=>{
// const curPageData = res.list || [] // 当前页数据
// if(mescroll.num == 1) goods.value = []; // 第一页需手动制空列表
// goods.value = goods.value.concat(curPageData); //追加新数据
// //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
// //mescroll会根据传的参数,自动判断列表如果无任何数据,则提示空;列表无下一页数据,则提示无更多数据;
// //方法一(推荐): 后台接口有返回列表的总页数 totalPage
// //mescroll.endByPage(curPageData.length, totalPage); //必传参数(当前页的数据个数, 总页数)
// //方法二(推荐): 后台接口有返回列表的总数据量 totalSize
// //mescroll.endBySize(curPageData.length, totalSize); //必传参数(当前页的数据个数, 总数据量)
// //方法三(推荐): 您有其他方式知道是否有下一页 hasNext
// //mescroll.endSuccess(curPageData.length, hasNext); //必传参数(当前页的数据个数, 是否有下一页true/false)
// //方法四 (不推荐),会存在一个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据当前页的数据个数判断,则需翻到第三页才会知道无更多数据.
// mescroll.endSuccess(curPageData.length); // 请求成功, 结束加载
// }).catch(()=>{
mescroll.endErr(); // 请求失败, 结束加载
// })
getTeaSpecialistOrderList(filter).then((res) => {
const curPageData = res.list || [] // 当前页数据
if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表
list.value = list.value.concat(curPageData) //追加新数据
mescroll.endSuccess(curPageData.length, Boolean(res.more))
}).catch(() => {
mescroll.endErr() // 请求失败, 结束加载
})
},
// 切换tab
handleChangeTabs: (e: {index: number, name: string}) => {
tab.value = e.name
if (e.name === TeaSpecialistOrderStatusText.Pending) {
orderStatus.value = '0'
} else {
orderStatus.value = TeaSpecialistOrderStatusValue[e.name] || ''
}
// 切换tab时,重置当前的mescroll
// getMescroll().resetUpScroll();
list.value = []
getMescroll().resetUpScroll();
},
// 返回上一页
@ -159,6 +150,14 @@
background-color: $cz-page-background;
}
.order-list {
:deep() {
.wd-navbar__left {
width: 100%;
}
}
}
.tabs {
:deep() {
.wd-tabs,

View File

@ -23,7 +23,7 @@
: selectedTime.includes(item2.start_time)
? 'bg-[#F1F8F0] text-[#4C9F44]' // 选中高亮
: 'bg-[#F7F7F7] text-[#303133]', // 可选高亮
]" @click="item2.disabled == 1 && bookingTime.handleSelectTime(item2.start_time)">
]" @click="item2.disabled == 1 && bookingTime.handleSelectTime(item2.start_time, item2.timestamp)">
{{ item2.start_time }}
</view>
</view>
@ -79,48 +79,31 @@
// 初始化时间
onMounted(() => {
bookingTime.handleInitTime()
// bookingTime.handleInitTime()
})
/** 日期相关 **/
const timeList = [
{ time: '09:00', disabled: true },
{ time: '09:30', disabled: false },
{ time: '10:00', disabled: false },
{ time: '10:30', disabled: false },
{ time: '11:00', disabled: false },
{ time: '11:30', disabled: false },
]
const weekMap = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
const days = ref<string[]>([])
const selectedDay = ref<number>(0)
const selectedTime = ref<string[]>([])
const selectedTimeStamp = ref<number[]>([])
const countSelectedTime = ref<number>(0)
const bookingTime = {
// 初始化时间逻辑
handleInitTime: () => {
const today = new Date()
const result: string[] = []
for (let i = 0; i < 7; i++) {
const d = new Date(today)
d.setDate(today.getDate() + i)
const month = d.getMonth() + 1
const date = d.getDate()
const week = weekMap[d.getDay()]
result.push(`${month}/${date}${week}`)
}
days.value = result
console.log("🚀 ~ days.value:", days.value)
},
// 选择的时间高亮显示
handleSelectTime: (time: string) => {
handleSelectTime: (time: string, timestamp: number) => {
const idx = selectedTime.value.indexOf(time)
if (idx > -1) {
selectedTime.value.splice(idx, 1) // 取消选中
selectedTimeStamp.value.splice(idx, 1)
} else {
selectedTime.value.push(time) // 选中
selectedTimeStamp.value.push(timestamp)
}
// 计算时长
@ -142,7 +125,8 @@
const data = [
selectedDay.value,
selectedTime.value
selectedTime.value,
selectedTimeStamp.value.sort(),
]
emit('selectedTime', data)
showPopup.value = false
@ -151,12 +135,14 @@
// 切换时间tab的时候把之前选中的时间重置
handleChangeTimeTab: () => {
selectedTime.value = []
selectedTimeStamp.value = []
countSelectedTime.value = 0
},
// 重置选择的时间
resetSelectedTime: () => {
selectedTime.value = []
selectedTimeStamp.value = []
},
}

View File

@ -145,54 +145,63 @@
<view v-if="type === OrderSource.TeaSpecialist" class="bg-white rounded-10rpx p-28rpx">
<view class="flex items-center">
<view class="mr-28rpx">
<wd-img width="200rpx" height="200rpx" :src="`${OSS}images/home/home_image5.png`"></wd-img>
<wd-img width="200rpx" height="200rpx" :src="order.image"></wd-img>
</view>
<view class="flex-1" @click="comboCard.handleToOrderDetail">
<view class="flex items-center relative">
<view class="w-400rpx flex items-center">
<view class="font-bold text-[#303133] text-30rpx leading-42rpx mr-14rpx">茶艺师</view>
<view class="w-160rpx h-40rpx relative mr-44rpx">
<view class="absolute left-0 top-0 h-36rpx flex items-start">
<wd-img :src="`${OSS}icon/icon_gold_medal.png`" width="36rpx" height="36rpx"></wd-img>
</view>
<view class="bg-[#F0F6EF] text-[#006C2D] font-400 text-22rpx leading-32rpx rounded-4rpx text-center w-150rpx ml-18rpx pb-4rpx">金牌茶艺师</view>
<view class="font-bold text-[#303133] text-30rpx leading-42rpx mr-14rpx">{{ order.name }}</view>
<view class="">
<tea-specialist-level :level="TeaSpecialistLevelValue[order.teamasterLevel[0].level_name]"></tea-specialist-level>
</view>
</view>
<view class="font-400 text-28rpx leading-20rpx text-[#4C9F44] flex items-center absolute top-6rpx right-0">
<text v-if="orderStatus === OrderStatus.Consuming">消费中</text>
<text v-if="orderStatus === OrderStatus.Reserved">已预约</text>
<text v-if="orderStatus === OrderStatus.Serving">服务中</text>
<text v-if="orderStatus === OrderStatus.Finished" class="text-[#606266]">完成</text>
<text v-if="orderStatus === OrderStatus.Pending" class="text-[#FF5951]" >待付款</text>
<text v-if="orderStatus === OrderStatus.Cancelled" class="text-[#C9C9C9]" >订单取消</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Pending" class="text-[#FF5951]" >待付款</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Pay">已预约</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Serving">服务中</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Confirm" class="text-[#F29747]">待确认</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Finished" class="text-[#606266]">完成</text>
<text v-if="order.order_status === TeaSpecialistOrderStatus.Cancelled" class="text-[#C9C9C9]" >订单取消</text>
</view>
</view>
<view class="flex items-center">
<template v-for="(label, labelIndex) in order.teamasterlabel" :key="labelIndex">
<!-- 上门服务 -->
<view class="mr-12rpx" v-if="label.id == 1">
<wd-tag color="#40AE36" bg-color="#40AE36" plain custom-class="!rounded-4rpx">{{ label.label_name }}</wd-tag>
</view>
<!-- 到点服务 -->
<view class="mr-12rpx" v-if="label.id == 2">
<wd-tag color="#F55726" bg-color="#F55726" plain custom-class="!rounded-4rpx">{{ label.label_name }}</wd-tag>
</view>
</template>
<view class="mr-12rpx">
<wd-tag color="#40AE36" bg-color="#40AE36" plain custom-class="!rounded-4rpx">上门服务</wd-tag>
<wd-tag color="#818CA9" bg-color="#F3F3F3">{{ order.both }}</wd-tag>
</view>
<view>
<wd-tag color="#F55726" bg-color="#F55726" plain>到点服务</wd-tag>
<view class="flex items-center mt-8rpx">
<wd-img :src="order.sex == 1 ? `${OSS}icon/icon_man.png` : `${OSS}icon/icon_woman.png`" width="28rpx" height="28rpx"></wd-img>
</view>
</view>
<view class="font-400 text-[#606266] text-26rpx leading-36rpx mt-42rpx">
预约时间03/18 08:00-12:00
预约时间{{ order.start_time }} - {{ order.end_time }}
</view>
</view>
</view>
<!-- 操作按钮 -->
<view>
<view v-if="orderStatus === OrderStatus.Finished || orderStatus === OrderStatus.Cancelled"
<view v-if="order.order_status === TeaSpecialistOrderStatus.Finished || order.order_status === TeaSpecialistOrderStatus.Cancelled"
class="flex items-center text-28rpx mt-28rpx justify-end"
@click="comboCard.handleDeleteOrder(OrderSource.TeaSpecialist)">
<view class="w-178rpx h-70rpx rounded-8rpx border-[2rpx] border-[#9CA3AF] text-[#303133] flex items-center justify-center">
删除订单
</view>
</view>
<view v-if="orderStatus === OrderStatus.Pending"
<view v-if="order.order_status === TeaSpecialistOrderStatus.Pending"
class="flex items-center text-28rpx mt-28rpx justify-end">
<view class="w-178rpx h-70rpx rounded-8rpx border-[2rpx] border-[#9CA3AF] text-[#303133] mr-28rpx flex items-center justify-center"
@click="comboCard.handleCancelOrder(OrderSource.TeaSpecialist)">
@ -213,6 +222,9 @@
import { OrderSource, OrderStatus } from '@/utils/order'
import { useMessage } from 'wot-design-uni'
import { toast } from '@/utils/toast'
import { TeaSpecialistOrderStatus, TeaSpecialistOrderStatusText } from '@/utils/order'
import {TeaSpecialistLevelValue} from '@/utils/teaSpecialist'
import { router } from '@/utils/tools'
/**
* ComboCard 套餐卡片组件
@ -236,6 +248,11 @@
orderStatus: {
type: String,
default: OrderStatus.ToUse
},
order: {
type: Object,
default: {}
}
})
@ -336,30 +353,8 @@
handleToOrderDetail: () => {
// TODO 这里要对不同类型的订单进行区分跳转一个是直营的一个市加盟的
switch (props.type) {
case OrderSource.Direct:
uni.navigateTo({
url: `/bundle/order/platform/direct-order-detail?orderStatus=${props.orderStatus}`
})
break;
case OrderSource.Franchise:
uni.navigateTo({
url: `/bundle/order/platform/franchise-order-detail?orderStatus=${props.orderStatus}`
})
break;
case OrderSource.DouYin:
uni.navigateTo({
url: `/bundle/order/douyin/douyin-order-detail?orderStatus=${props.orderStatus}`
})
break;
case OrderSource.TeaRoom:
uni.navigateTo({
url: `/bundle/order/tea-room/order-detail?orderStatus=${props.orderStatus}`
})
break;
case OrderSource.TeaSpecialist:
uni.navigateTo({
url: `/bundle/order/tea-specialist/order-detail?orderStatus=${props.orderStatus}`
})
router.navigateTo(`/bundle/order/tea-specialist/order-detail?orderId=${props.order.id}`)
break;
default:
break;

13
src/hooks/useOrder.ts Normal file
View File

@ -0,0 +1,13 @@
import { router } from '@/utils/tools'
import { toast } from '@/utils/toast'
import { cancelTeaSpecialistOrder } from '@/api/order'
// 取消订单
export async function handleCancelOrder(id: number) {
try {
const response = await cancelTeaSpecialistOrder({ id })
} catch (error) {
router.navigateBack()
throw error
}
}

View File

@ -27,7 +27,7 @@ export const getUrlCode = (): { [key: string]: string | undefined } => {
*/
export async function snsapiBaseAuthorize() {
// TODO 测试代码
wxSnsapiBaseLogin({code: '011haFFa1oJbzK04a8Ha1qQHey0haFFJ'}).then((res: IUserInfoVo) => {
wxSnsapiBaseLogin({code: '0417vVGa1MfYBK0binIa1xEQQB37vVGV'}).then((res: IUserInfoVo) => {
console.log("登录成功 ~ snsapiBaseAuthorize ~ res:", res)
// 映射 IUserLogin 到 IUserInfoVo
useUserStore().setUserInfo(res)

View File

@ -16,7 +16,7 @@
<view class="mt-56rpx text-center">
<view class="text-28rpx leading-40rpx text-#606266">顾客打赏-{{ info.name }}</view>
<view class="mt-24rpx">
<price-format color="#303133" :first-size="44" :second-size="44" :subscript-size="28" :price="tipMoney"></price-format>
<price-format color="#303133" :first-size="44" :second-size="44" :subscript-size="28" :price="money"></price-format>
</view>
<view class="mt-12rpx flex items-center justify-center">
<view class="text-24rpx leading-34rpx text-#606266">
@ -42,21 +42,27 @@
<script lang="ts" setup>
import Pay from '@/components/Pay.vue'
import { getTeaSpecialistDetails } from '@/api/tea'
import { getTeaSpecialistDetails, getTeaSpecialistOrderDetails, teaSpecialistPrepay, teaSpecialistPay } from '@/api/tea'
import { ITeaSpecialistDetailsFields } from '@/api/types/tea'
import { toast } from '@/utils/toast'
import { router } from '@/utils/tools'
import { payTipTeaSpecialist } from '@/api/pay'
import { useUserStore } from '@/store'
import type {IUserInfoVo } from '@/api/types/login'
// 用户信息
const userInfo = ref<IUserInfoVo>(null)
// 支付倒计时取消
const time = ref<number>(30 * 60 * 60 * 1000)
// 打赏金额
const tipMoney = ref<number>(0)
// 支付金额
const money = ref<number>(0)
// 茶艺师详情
const id = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({
id: 0,
name: '',
star: 0,
image: '',
@ -68,27 +74,34 @@
teamasterLevel: [],
price: 0,
fare_price: 0,
collect: 0
collect: 0,
up_status: 0
})
// 支付方式
const pay = ref<number>(0)
// 订单
const orderId = ref<number>(0)
const order = ref<{}>(null)
const result = ref<string>('')
const from = ref<string>('')
onLoad(async (args) => {
if (args.id && args.lat && args.lng && args.user_id && args.money) {
id.value = Number(args.id)
tipMoney.value = Number(args.money)
const userStore = useUserStore()
userInfo.value = userStore.userInfo
// 获取茶艺师详情
const res = await getTeaSpecialistDetails({
id: args.id,
latitude: args.lat,
longitude: args.lng,
user_id: args.user_id
})
// 将返回的数据合并到 reactive 对象中
Object.assign(info, res.teamaster || {})
from.value = args.from || ''
if (args.from == 'tip' && args.teaSpecialistId && args.money) {
// 这边处理打赏金额
id.value = Number(args.teaSpecialistId)
money.value = Number(args.money)
Cashier.handleGetTeaSpecialistDetails(id.value, Number(userInfo.value.id))
} else if (args.from == 'order' && args.teaSpecialistId && args.orderId) {
// 获取订单详情
orderId.value = Number(args.orderId)
Cashier.handleGetOrderDetails()
} else {
toast.info('参数错误')
return
@ -97,22 +110,84 @@
console.log('页面加载')
})
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 = {
// 获取茶艺师详情
handleGetTeaSpecialistDetails: async (id: number, user_id: number) => {
const res = await getTeaSpecialistDetails({
id,
latitude: uni.getStorageSync('latitude'),
longitude: uni.getStorageSync('longitude'),
user_id
})
// 将返回的数据合并到 reactive 对象中
Object.assign(info, res.teamaster || {})
},
// 获取订单详情
handleGetOrderDetails: async () => {
// 获取订单详情接口
const res = await getTeaSpecialistOrderDetails({id: orderId.value})
order.value = res
money.value = Number(res.details.order_amount)
},
// 获取支付方式
handleGetPayValue: (value: number) => {
pay.value = value
},
// 去支付
handleToPay: () => {
payTipTeaSpecialist({
id: id.value,
tip_price: tipMoney.value,
pay_type: pay.value
}).then(res => {
router.navigateTo('/pages/notice/reserve?type=tipSuccess')
console.log("🚀 ~ res:", res)
})
handleToPay: async () => {
console.log("🚀 ~ pay.value :", pay.value )
if (pay.value == null || pay.value == undefined) {
toast.info('请选择支付方式')
return
}
if (from.value == 'tip') {
payTipTeaSpecialist({
id: id.value,
tip_price: money.value,
pay_type: pay.value
}).then(res => {
router.navigateTo('/pages/notice/reserve?type=tipSuccess')
console.log("🚀 ~ res:", res)
})
} else if (from.value == 'order') {
try {
// 预支付
const res1 = await teaSpecialistPrepay({
order_id: orderId.value,
from: 'balance',
pay_way: pay.value,
order_source: 2 //订单来源1-小程序;2-h5;3app
})
// 支付
const res2 = await teaSpecialistPay({
id: res1.pay_id
})
result.value = 'success'
} catch (error) {
result.value = 'fail'
}
setTimeout(() => {
uni.navigateBack({delta: 1})
}, 500);
}
}
}
</script>

View File

@ -283,7 +283,7 @@
<script lang="ts" setup>
import TeaSpecialistLevel from '@/components/TeaSpecialistLevel.vue'
import { useMessage } from 'wot-design-uni'
import { getTeaSpecialistDetails, collectTeaSpecialist, getTeaSpecialistRewardAmounts } from '@/api/tea'
import { getTeaSpecialistDetails, collectTeaSpecialist, getTeaSpecialistRewardAmounts, teaSpecialistInvite } from '@/api/tea'
import { ITeaSpecialistDetailsFields } from '@/api/types/tea'
import type { ITeaSpecialistRewardAmountsResult } from '@/api/types/tea'
import { toast } from '@/utils/toast'
@ -310,6 +310,7 @@
// 茶艺师
const id = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({
id: 0,
name: '',
star: 0,
image: '',
@ -321,7 +322,8 @@
teamasterLevel: [],
price: 0,
fare_price: 0,
collect: 0
collect: 0,
up_status: 0
})
const latitude = ref<number>(0) // 纬度
const longitude = ref<number>(0) // 经度
@ -370,6 +372,11 @@
Object.assign(info, res.teamaster || {})
rate.value = info.star
// 茶艺师是否上线
// if (info.up_status == 0) {
// isReserve.value = true
// }
if (info.teamasterlabel) {
info.teamasterlabel.map(item => {
if (item.label_name == '90后茶艺师') {
@ -417,15 +424,15 @@
handleReserve: () => {
message.alert({
title: '邀约茶艺师',
msg: '尊敬的客户我们即将向[茶艺师姓名]发出服务邀约,请过十分钟后刷新页面,谢谢您的支持!',
msg: `尊敬的客户我们即将向[${info.name}]发出服务邀约,请过十分钟后刷新页面,谢谢您的支持!`,
confirmButtonText: '好的',
confirmButtonProps: {
customClass: '!bg-[#4C9F44] !text-[#fff] !text-32rpx !leading-44rpx !rounded-8rpx',
}
}).then((res) => {
// 点击确认按钮回调事件
}).catch(() => {
// 点击取消按钮回调事件
}).then(async res => {
await teaSpecialistInvite({
id: info.id,
})
})
},
@ -441,7 +448,7 @@
isOtherTip.value = true
} else {
showTipTeaSpecialistPopup.value = false
router.navigateTo(`/pages/cashier/cashier?id=${id.value}&lat=${latitude.value}&lng=${longitude.value}&user_id=${userInfo.value.id}&money=${item.tip_price}`)
router.navigateTo(`/pages/cashier/cashier?id=${id.value}&lat=${latitude.value}&lng=${longitude.value}&money=${item.tip_price}`)
}
},
@ -452,7 +459,7 @@
return
}
showTipTeaSpecialistPopup.value = false
router.navigateTo(`/pages/cashier/cashier?id=${id.value}&lat=${latitude.value}&lng=${longitude.value}&user_id=${userInfo.value.id}&money=${tipMoney.value}`)
router.navigateTo(`/pages/cashier/cashier?from=tip&teaSpecialistId=${id.value}&money=${tipMoney.value}`)
},
// 预约茶艺师

View File

@ -179,10 +179,10 @@
}
const latitude = ref<number>(import.meta.env.VITE_DEFAULT_LATITUDE) // 纬度
const longitude = ref<number>(import.meta.env.VITE_DEFAULT_LONGITUDE) // 经度
// 存储经纬度
uni.setStorageSync('latitude', latitude.value)
uni.setStorageSync('longitude', longitude.value)
// 经纬度缓存过期处理1小时
const LOCATION_EXPIRE_KEY = 'location_expire_time'
const LOCATION_EXPIRE_MS = 60 * 60 * 1000 // 1小时
const defaultCity = ref<string>(import.meta.env.VITE_DEFAULT_ADDRESS) // 默认城市
const list = ref<Array<any>>([]) // 茶艺师列表
const teaSpecialistName = ref<string>('') // 茶艺师名称
@ -190,18 +190,8 @@
const cityValue = ref<string>('')
onLoad(async () => {
// 授权获取地址
await wxGetLocation((res) => {
latitude.value = res.latitude
longitude.value = res.longitude
// 授权后存储经纬度
uni.setStorageSync('latitude', latitude.value)
uni.setStorageSync('longitude', longitude.value)
Index.handleSearch()
})
// 检查缓存是否过期,超时则重新授权
await Index.handleEnsureLocationAuth()
// 获取城市列表
getCity({latitude: latitude.value, longitude: longitude.value}).then((res: any) => {
@ -213,8 +203,8 @@
})
})
// getDecorate({id: 1}).then((res: any) => {
// const data = JSON.parse(res.data)
// console.log('装修数据:', data)
// const data = JSON.parse(res.data)
// console.log('装修数据:', data)
// })
// 等待授权完成后再加载数据
@ -224,6 +214,52 @@
})
const Index = {
// 设置经纬度缓存
handleSetLocationCache: (lat: number, lng: number) => {
uni.setStorageSync('latitude', lat)
uni.setStorageSync('longitude', lng)
uni.setStorageSync(LOCATION_EXPIRE_KEY, Date.now() + LOCATION_EXPIRE_MS)
},
// 检查经纬度缓存是否过期
handleCheckLocationCache: () => {
const expire = uni.getStorageSync(LOCATION_EXPIRE_KEY)
if (expire && Date.now() > expire) {
uni.removeStorageSync('latitude')
uni.removeStorageSync('longitude')
uni.removeStorageSync(LOCATION_EXPIRE_KEY)
return false
}
return true
},
// 初始化经纬度
handleEnsureLocationAuth: async () => {
if (!Index.handleCheckLocationCache()) {
// 超时,重新获取授权
await wxGetLocation((res) => {
latitude.value = res.latitude
longitude.value = res.longitude
Index.handleSetLocationCache(latitude.value, longitude.value)
Index.handleSearch()
})
} else {
const lat = uni.getStorageSync('latitude')
const lng = uni.getStorageSync('longitude')
if (lat && lng) {
latitude.value = lat
longitude.value = lng
} else {
await wxGetLocation((res) => {
latitude.value = res.latitude
longitude.value = res.longitude
Index.handleSetLocationCache(latitude.value, longitude.value)
Index.handleSearch()
})
}
}
},
// 选择城市
handleSelectCity: (e: any) => {
cityValue.value = e.value

View File

@ -66,7 +66,7 @@
<wd-img width="100%" height="100%" :src="`${OSS}images/my/my_image3.png`" mode="aspectFill"></wd-img>
</view>
<view class="text-[#303133] absolute bottom-12rpx left-24rpx text-center">
<view class="text-30rpx leading-36rpx fon-bold">{{ isLogin ? '¥2106.3623' : '- -' }}</view>
<view class="text-30rpx leading-36rpx fon-bold">{{ isLogin ? user.user_money : '- -' }}</view>
<view class="text-20rpx leading-28rpx ml-10rpx">平台余额</view>
</view>
</view>
@ -190,6 +190,7 @@
// 登录信息相关
const userInfo = ref<any>(null)
const user = ref<any>(null)
const isLogin = ref<boolean>(false)
const isVip = ref<boolean>(true)
@ -220,8 +221,10 @@
userInfo.value = userStore.userInfo
isLogin.value = true
const user = getUserInfo()
console.log("🚀 ~ user:", user)
// 获取用户详情信息接口
getUserInfo().then(res => {
user.value = res
})
} else if (code && !userStore.userInfo.token) {
// 这里是微信授权之后跳转回到本页面获取到code但是没有登录状态的话需要进行登录操作

View File

@ -10,7 +10,7 @@
<template>
<view class="pb-70rpx">
<view class="">
<navbar title="加盟合作" custom-class='!bg-[#F6F7F8]'></navbar>
<navbar title="预订团体茶艺师" custom-class='!bg-[#F6F7F8]' :leftArrow="false"></navbar>
</view>
<view class="mx-30rpx mt-38rpx">
@ -25,14 +25,7 @@
</view>
<view class="flex items-center">
<wd-input placeholder="请填写预约人数" no-border></wd-input>
</view>
</view>
<view class="flex items-center mt-46rpx" v-if="form.settleIn === 2">
<view class="text-32rpx leading-44rpx text-#303133 mr-66rpx">门店名称</view>
<view class="flex-1">
<wd-input no-border placeholder="请填写门店名称" custom-class="!bg-[#F6F7F8] !rounded-16rpx !px-28rpx !py-20rpx"></wd-input>
<wd-input placeholder="请填写预约人数" no-border v-model='form.numbers'></wd-input>
</view>
</view>
</view>
@ -48,7 +41,7 @@
<view>
<wd-checkbox-group v-model="requirementValue" inline shape="square" checked-color="#4C9F44">
<wd-checkbox custom-class="!mr-40rpx" :modelValue="item.value" v-for="(item, index) in requirement" :key="index">{{ item.label }}</wd-checkbox>
<wd-checkbox custom-class="!mr-40rpx" :modelValue="item.label" v-for="(item, index) in requirement" :key="index">{{ item.label }}</wd-checkbox>
</wd-checkbox-group>
</view>
</view>
@ -81,14 +74,14 @@
<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="请填写联系人" ></wd-input>
<wd-input no-border placeholder="请填写联系人" v-model="form.contact"></wd-input>
</view>
</view>
<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="请填写手机号"></wd-input>
<wd-input no-border placeholder="请填写手机号" v-model="form.phone"></wd-input>
</view>
</view>
@ -121,19 +114,19 @@
<view class="mt-22rpx">
<view class="text-26rpx leading-32rpx text-#606266">详细地址</view>
<view class="mt-20rpx pb-20rpx">
<wd-input no-border placeholder="请输入小区/写字楼"></wd-input>
<wd-input no-border placeholder="请输入小区/写字楼" v-model="form.address"></wd-input>
</view>
</view>
</view>
</view>
<!-- 留言建议 -->
<!-- 订单信息 -->
<view class="bg-white rounded-16rpx px-30rpx py-32rpx mt-20rpx">
<view class="text-32rpx leading-44rpx text-#303133 mb-32rpx flex items-center">
留言建议
订单信息<text class="text-26rpx leading-36rpx text-[#909399] ml-20rpx">(选填)</text>
</view>
<view class="">
<wd-textarea placeholder="有想说的可以在这里写哦!" v-model="form.message" custom-class='!rounded-18rpx !border-2rpx !border-[#EFF0EF] !bg-[#F8F9FA]' custom-textarea-class='!bg-[#F8F9FA]' />
<wd-textarea placeholder="有想说的可以在这里写哦!" v-model="form.content" custom-class='!rounded-18rpx !border-2rpx !border-[#EFF0EF] !bg-[#F8F9FA]' custom-textarea-class='!bg-[#F8F9FA]' />
</view>
</view>
</view>
@ -147,6 +140,8 @@
<script lang="ts" setup>
import { useColPickerData } from '@/hooks/useColPickerData'
import {toast} from '@/utils/toast'
import {ITeaSpecialistGroupReserveParams, teaSpecialistGroupReserve} from '@/api/tea'
import { router } from '@/utils/tools'
const OSS = inject('OSS')
@ -182,8 +177,8 @@
resolve(
areaData.map((item) => {
return {
value: item.value,
label: item.text
value: item.value,
label: item.text
}
})
)
@ -191,6 +186,7 @@
finish()
}
}
const address = ref<string[]>([])
// 上传文件
const fileList = ref<any[]>([])
@ -202,14 +198,18 @@
const countDown = ref<any>(null) // 倒计时组件
// 表单
const form = reactive<{
settleIn: number,
code: string,
message: string
}>({
settleIn: 1,
const form = reactive<ITeaSpecialistGroupReserveParams>({
numbers: '',
other_require: '',
res_time: '',
contact: '',
phone: '',
code: '',
message: ''
province: '',
city: '',
district: '',
address: '',
content: '',
})
const GroupTeaSpecialist = {
@ -234,8 +234,10 @@
},
// 确认选择地址
handleConfirmAddress: (selected) => {
console.log("🚀 ~ selected:", selected)
handleConfirmAddress: (items) => {
form.province = items.selectedItems[0]?.label || ''
form.city = items.selectedItems[1]?.label || ''
form.district = items.selectedItems[2]?.label || ''
},
// 日期过滤
@ -243,7 +245,6 @@
if (type === 'year') {
const currentYear = new Date().getFullYear()
return values.filter((year) => year == currentYear)
}
return values
},
@ -258,11 +259,62 @@
},
// 提交订单
handleSubmitOrder: () => {
// 这里还需要多日期进行校验
uni.navigateTo({
url: '/pages/notice/reserve?type=groupTeaSpecialist'
})
handleSubmitOrder: async() => {
const require = requirementValue.value.join(',')
// 日期格式化为 yyyy-MM-dd
const d = new Date(timeValue.value)
const year = d.getFullYear()
const month = (d.getMonth() + 1).toString().padStart(2, '0')
const day = d.getDate().toString().padStart(2, '0')
const time = `${year}-${month}-${day}`
form.other_require = require
form.res_time = time
if (form.numbers.trim() === '') {
toast.info('请填写预约人数')
return
}
if (form.res_time.trim() === '') {
toast.info('请选择预定日期')
return
}
if (form.contact.trim() === '') {
toast.info('请填写联系人')
return
}
if (form.phone.trim() === '') {
toast.info('请填写手机号')
return
}
if (form.code.trim() === '') {
toast.info('请填写验证码')
return
}
if (form.province.trim() === '' || form.city.trim() === '' || form.district.trim() === '') {
toast.info('请选择省市区')
return
}
if (form.address.trim() === '') {
toast.info('请填写详细地址')
return
}
try {
await teaSpecialistGroupReserve(form)
setTimeout(() => {
router.navigateTo('/pages/notice/reserve?type=groupTeaSpecialist')
}, 800)
} catch (error) {}
console.log("🚀 ~ form:", form)
},
checkedData: (date: number) => {
@ -272,12 +324,14 @@
d.setHours(0, 0, 0, 0)
if (d < today) {
toast.info("请选择大于今天的日期")
timeValue.value = Date.now()
return false
}
return true
}
}
console.log("🚀 ~ value:", value)
</script>
<style lang="scss">

View File

@ -77,35 +77,6 @@
</view>
</wd-popup>
<!-- 支付 -->
<wd-popup v-model="showPayPopup" lock-scroll custom-style="border-radius: 32rpx 32rpx 0rpx 0rpx;" @close="showPayPopup = false" position="bottom">
<view class='bg-[#FBFBFB] py-40rpx realtive'>
<view class="absolute top-18rpx right-30rpx" @click="showPayPopup = false">
<wd-img width="60rpx" height='60rpx' :src="`${OSS}icon/icon_close.png`"></wd-img>
</view>
<view class="text-36rpx text-[#121212] leading-50rpx text-center">支付</view>
<view class="mx-30rpx bg-white rounded-16rpx px-30rpx pt-40rpx mt-40rpx pb-30rpx">
<wd-radio-group v-model="pay" shape="dot" checked-color="#4C9F44">
<view class="pay" v-for="(item, index) in PayList" :key="index" @click="pay = item.id">
<view class="flex justify-between items-center" v-if="pay == item.value" >
<view class="flex items-center">
<wd-img width="50rpx" height="50rpx" :src="item.icon"></wd-img>
<view class="ml-20rpx text-30rpx text-[#303133] leading-42rpx">{{ item.name }}</view>
</view>
<view class="flex items-center">
<wd-radio :value="item.value">
<view class="text-[#303133] text-26rpx leading-36rpx mr-20rpx">可用202.22</view>
</wd-radio>
</view>
</view>
</view>
</wd-radio-group>
</view>
<view class='bg-[#4C9F44] text-[#fff] rounded-8rpx h-90rpx leading-90rpx mx-60rpx box-border text-center mt-170rpx' @click="TeaRoom.handlePay">确定付款</view>
</view>
</wd-popup>
<!-- 茶艺服务 -->
<wd-popup v-model="showTeaServicePopup" lock-scroll custom-style="border-radius: 32rpx 32rpx 0rpx 0rpx;" position="bottom">
<view class="relative">
@ -217,14 +188,10 @@
<view class="mt-20rpx bg-white px-30rpx py-34rpx">
<view class="flex items-center justify-between">
<view class="font-bold text-32rpx leading-44rpx">服务方式</view>
<view>
<wd-radio-group v-model="serviceTypeValue" shape="dot" checked-color="#4C9F44" inline>
<block v-for="(item, index) in serviceType" :key="index">
<wd-radio :value="item.type">
<view class="text-[#303133] text-26rpx leading-36rpx mt-4rpx">{{item.name}}</view>
</wd-radio>
</block>
</wd-radio-group>
<view class="bg-[#F0F6EF] h-60rpx rounded-20rpx flex items-center justify-between py-14rpx px-30rpx relative w-304rpx font-400 text-26rpx text-[#333]">
<view class="absolute left-30rpx top-1/2 -translate-y-1/2 z-2" :class="serviceTypeValue == 1 ? 'text-[#fff]' : ''" @click="TeaRoom.handleChooseService(1)">到店服务</view>
<view class="absolute right-30rpx top-1/2 -translate-y-1/2 z-2" :class="serviceTypeValue == 2 ? 'text-[#fff]' : ''" @click="TeaRoom.handleChooseService(2)">上门服务</view>
<view class="swiper-service"></view>
</view>
</view>
@ -330,9 +297,9 @@
</view>
<!-- 支付方式 -->
<view class="bg-white py-26rpx px-30rpx mt-20rpx">
<pay hide-store-balance></pay>
</view>
<!-- <view class="bg-white py-26rpx px-30rpx mt-20rpx">
<pay hide-store-balance @pay="TeaRoom.handleGetPayValue"></pay>
</view> -->
<view class="fixed left-0 right-0 bottom-0 z-2 bg-[#fff]"
:style="{ height: '140rpx' }">
@ -366,7 +333,7 @@
import {ReserveServiceCategory} from '@/utils/order'
import { PayList, PayCategory, PayValue } from '@/utils/pay'
import Pay from '@/components/Pay.vue'
import { getTeaSpecialistDetails, getNext7Days, getTeaTypeList } from '@/api/tea'
import { getTeaSpecialistDetails, getNext7Days, getTeaTypeList, createTeaSpecialistOrder } from '@/api/tea'
import type { ITeaSpecialistDetailsFields, ITeaSpecialistFuture7DaysResult, ITeaTypeListResult } from '@/api/types/tea'
import { TeaSpecialistLevelValue } from '@/utils/teaSpecialist'
import type { IUserAddressListResult } from '@/api/types/user'
@ -391,6 +358,7 @@
minimum_time: 0,
time: []
})
const reserveTime = ref<Array<any>>([])
// 上门服务选择的地址
const address = ref<IUserAddressListResult>({
@ -428,18 +396,18 @@
const orderRemarks = ref<string>('')
// 支付方式
const pay = ref<number>(1)
const pay = ref<number>(0)
const html: string = '<p>这里是富文本内容,需要后台传递</p>'
const isGroupBuying: boolean = false // 是否是团购套餐
// 费用明细相关
const showCostPopup = ref<boolean>(false) // 费用明细popup
const showPayPopup = ref<boolean>(false) // 支付popup
// 茶艺师
const teaSpecialistId = ref<number>(0)
const info = reactive<ITeaSpecialistDetailsFields>({
id: 0,
name: '',
star: 0,
image: '',
@ -451,7 +419,8 @@
teamasterLevel: [],
price: 0,
fare_price: 0,
collect: 0
collect: 0,
up_status: 0
})
const is90 = ref<boolean>(false)
@ -463,7 +432,9 @@
service: {
total: 0,
unitPrice: 0,
num: 0
num: 0,
startTime: 0,
endTime: 0
},
travel: {
total: 0,
@ -481,15 +452,7 @@
total: 0
})
// 提交的数据
const reserveTime = ref<Array<any>>([])
onLoad(async (args) => {
if (args.type == ReserveServiceCategory.GroupBuying) {
// TODO 如果是团购套餐则直接微信支付?
pay.value = 3
}
if (args.id) {
teaSpecialistId.value = Number(args.id)
@ -531,17 +494,22 @@
console.log("🚀 ~ teaList.value:", teaList.value)
},
// 选择服务方式
handleChooseService: (type: number) => {
serviceTypeValue.value = type
const swiperService = document.querySelector('.swiper-service') as HTMLElement
if (type == 1) {
swiperService.style.transform = 'translateY(-50%) translateX(0)'
} else if (type == 2) {
swiperService.style.transform = 'translateY(-50%) translateX(76px)'
}
},
handleClick: (item: any) => {
// 处理点击事件
console.log('Clicked item:', item)
},
handlePay: () => {
// 这里需要判断下如果是预约的话跳转结果通知是reserve的团购是pay的
// uni.navigateTo({ url: '/bundle/reserve-room/result' })
},
// 切换预定茶叶选择
handleToggleTea: (id: number, name: string, price: number) => {
const index = selectedTea.value.indexOf(id)
@ -558,7 +526,7 @@
}
totalSelectedTeaPrice.value = toPlus(selectedTeaPrice.value)
bill.value.teaService.total = totalSelectedTeaPrice.value
bill.value.teaService.total = Number(totalSelectedTeaPrice.value) // 更新茶艺服务费用
},
// 选择门店
@ -584,13 +552,22 @@
bill.value.service = {
total: toTimes(info.price, params[1].length),
unitPrice: info.price,
num: params[1].length
num: params[1].length,
startTime: params[2][0],
endTime: params[2][params[2].length - 1],
},
reserveTime.value = params
console.log("🚀 ~ bill.value:", bill.value)
},
// 跳转优惠券页面
handleToCoupon(type) {
if (reserveTime.value.length == 0) {
toast.info('请选择预定时间')
return
}
uni.$on('chooseCoupon', params => {
uni.$off('chooseCoupon')
console.log("🚀 ~ params:", params)
@ -598,13 +575,9 @@
bill.value.coupon = params.coupon.coupon_price
})
if (reserveTime.value.length == 0) {
toast.info('请选择预定时间')
return
}
// 获取预定了几个小时
const count = reserveTime.value[1].length
uni.navigateTo({ url: `/bundle/coupon/coupon?id=${teaSpecialistId.value}&time=${count}&type=${type}` })
uni.navigateTo({ url: `/bundle/coupon/coupon?id=${teaSpecialistId.value}&numbers=${count}&type=${type}` })
},
// 重置差茶艺服务
@ -624,10 +597,76 @@
showTeaServicePopup.value = false
},
// 获取支付方式
handleGetPayValue: (value: number) => {
pay.value = value
},
// 提交表单
handleSubmitOrder: () => {
showPayPopup.value = true
uni.navigateTo({ url: '/pages/notice/reserve?type=teaSpecialist' })
handleSubmitOrder: async () => {
if (serviceTypeValue.value == 1 && teaHouse.value.id == 0) {
toast.info('请选择门店地址')
return
}
if (serviceTypeValue.value == 2 && address.value.id == 0) {
toast.info('请选择上门服务地址')
return
}
if (reserveTime.value.length == 0) {
toast.info('请选择预定时间')
return
}
if (selectedTea.value.length == 0) {
toast.info('请选择茶艺时服务')
return
}
const params = {
teamaster_id: info.id,
address_id: address.value.id,
start_time: bill.value.service.startTime,
end_time: bill.value.service.endTime,
nums: servicePeople.value,
tea_id: selectedTea.value.join(','),
service_type: serviceTypeValue.value,
store_id: teaHouse.value.id,
latitude: uni.getStorageSync('latitude') || 0,
longitude: uni.getStorageSync('longitude') || 0,
remark: orderRemarks.value,
coupon_id: selectedCoupon.value.id || 0,
hours: bill.value.service.num
}
try {
const res = await createTeaSpecialistOrder(params)
uni.$on('payment', params => {
console.log("🚀 ~ params:", params)
setTimeout(() => {
uni.$off("payment")
if (params.result) {
uni.redirectTo({
url: `/pages/notice/reserve?type=teaSpecialist&orderId=${params.orderId}`
})
} else {
uni.redirectTo({
url: '/bundle/order/tea-specialist/order-list'
})
}
}, 1000)
})
setTimeout(() => {
router.navigateTo(`/pages/cashier/cashier?from=order&orderId=${res.id}&teaSpecialistId=${info.id}`)
}, 800)
} catch (error) {
toast.info('订单提交失败,请稍后重试')
return
}
}
}
@ -638,6 +677,7 @@
let total = Number(toPlus(s, t, ts))
if (bill.value.coupon > 0 ) {
total + bill.value.coupon
return total - bill.value.coupon
}
return total
@ -674,4 +714,19 @@
}
}
}
</style>
.swiper-service {
content: " ";
display: block;
background-color: #4C9F44;
width: 152rpx;
height: 56rpx;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
border-radius: 20rpx;
transition: all 0.3s ease;
z-index: 0;
}
</style>

View File

@ -165,4 +165,58 @@ export const OrderStatusTitle: Record<OrderSource, Record<OrderStatus, string>>
[OrderStatus.AfterSaleApply]: '申请售后',
[OrderStatus.AfterSaleProcessing]: '申请售后中'
}
}
}
// 茶艺师订单状态数字
export enum TeaSpecialistOrderStatus {
Pending = 0, // 待付款(未支付)
Pay = 1, // 预约单、已预约(已支付)
Cancelled = 2, // 已取消(订单取消)
Confirm = 3, // 待确认(已接单)
Serving = 4, // 服务中
Finished = 5, // 已完成
}
// 茶艺师订单状态文本
export enum TeaSpecialistOrderStatusText {
All = 'all', // 待付款
Pending = 'pending', // 待付款
Pay = 'pay', // 已支付(预约单、已预约)
Cancelled = 'cancelled', // 已取消
Confirm = 'confirm', // 待确认
Serving = 'serving', // 服务中
Finished = 'finished', // 已完成
}
// 状态内容映射
export const TeaSpecialistOrderStatusTextValue: Record<TeaSpecialistOrderStatus, any> = {
[TeaSpecialistOrderStatus.Pending]: {
title: '等待付款'
},
[TeaSpecialistOrderStatus.Pay]: {
title: '等待付款'
},
[TeaSpecialistOrderStatus.Cancelled]: {
title: '等待付款'
},
[TeaSpecialistOrderStatus.Confirm]: {
title: '等待付款'
},
[TeaSpecialistOrderStatus.Serving]: {
title: '等待付款'
},
[TeaSpecialistOrderStatus.Finished]: {
title: '等待付款'
},
}
export const TeaSpecialistOrderStatusValue: Record<TeaSpecialistOrderStatusText, string | number> = {
[TeaSpecialistOrderStatusText.All]: '',
[TeaSpecialistOrderStatusText.Pending]: 0,
[TeaSpecialistOrderStatusText.Pay]: 1,
[TeaSpecialistOrderStatusText.Cancelled]: 2,
[TeaSpecialistOrderStatusText.Confirm]: 3,
[TeaSpecialistOrderStatusText.Serving]: 4,
[TeaSpecialistOrderStatusText.Finished]: 5,
}

View File

@ -20,6 +20,12 @@ export enum PayValue {
StoreBalance = 3, // 门店余额
}
export const PayValueText: Record<PayValue, string> = {
[PayValue.PlatformBalance]: '平台余额',
[PayValue.WeChatPay]: '微信支付',
[PayValue.StoreBalance]: '门店余额',
}
// 支付方式列表
export const PayList: PayMethod[] = [
{