台球开关台小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

229 lines
7.3 KiB

/**
* 关灯重开页面
*/
import { View, Text, Image } from '@tarojs/components'
import Taro, { useLoad, useRouter } from '@tarojs/taro'
import { useState } from 'react'
import { observer } from 'mobx-react'
import { turnOffRestart, invokeWechatPay } from '../../api/startDevice'
import { userStore, tableStore } from '../../store'
import './index.scss'
// 使用本地图片资源
const phoneIcon = require('../startTable/images/phone.png')
const locationIcon = require('../../assets/icon/locationIcon.png')
const TurnOffRestart = observer(() => {
const router = useRouter()
const [loading, setLoading] = useState(false) // 加载状态
// 从路由参数获取设备信息和操作记录ID,如果没有则从 store 获取
const grpSn = tableStore.getGrpSn(router.params.grpSn)
const operationId = tableStore.getOperationId(Number(router.params.operationId))
const scanInfo = tableStore.scanInfo
const opInfo = scanInfo?.opInfo
const priceInfo = scanInfo?.price
useLoad(() => {
console.log('关灯重开页面加载, 设备编码:', grpSn, '操作记录ID:', operationId)
if (grpSn) tableStore.setCurrentGrpSn(grpSn)
if (operationId) tableStore.setCurrentOperationId(operationId)
})
// 拨打电话
const handlePhoneCall = () => {
Taro.makePhoneCall({
phoneNumber: '100-666-XXXX',
}).catch((err) => {
console.error('拨打电话失败:', err)
})
}
// 确认结算
const handleConfirmSettle = async () => {
if (loading) return
// 获取用户 openId
const openId = userStore.userInfo?.wxOpenId || Taro.getStorageSync('openId')
if (!openId) {
Taro.showToast({
title: '请先登录',
icon: 'none',
duration: 2000
})
return
}
if (!grpSn) {
Taro.showToast({
title: '设备信息异常',
icon: 'none',
duration: 2000
})
return
}
// 确认结算
const confirmResult = await Taro.showModal({
title: '确认结算',
content: '结算本次消费金额,押金于最后关台时结算。确定要继续吗?',
confirmText: '确定',
cancelText: '取消'
})
if (!confirmResult.confirm) {
return
}
setLoading(true)
try {
console.log('关灯重开,设备编码:', grpSn, '操作记录ID:', operationId)
// 调用关灯重开接口
const result = await turnOffRestart(grpSn, openId)
console.log('关灯重开接口返回:', result)
// 判断是否需要支付
if (result.data.paymentResponseDto?.payParameters) {
// 调起微信支付
try {
await invokeWechatPay(result.data.paymentResponseDto.payParameters)
// 支付成功
Taro.showToast({
title: '结算成功',
icon: 'success',
duration: 2000
})
// 返回关台页面或跳转到首页
setTimeout(() => {
Taro.navigateBack()
}, 2000)
} catch (payError: any) {
console.log('支付错误:', payError)
// 用户取消支付或支付失败
if (payError.errMsg?.includes('cancel')) {
Taro.showToast({
title: '已取消支付',
icon: 'none',
duration: 2000
})
} else {
Taro.showToast({
title: payError.errMsg || '支付失败',
icon: 'none',
duration: 2000
})
}
}
} else {
// 无需支付
Taro.showToast({
title: '结算成功',
icon: 'success',
duration: 2000
})
setTimeout(() => {
Taro.navigateBack()
}, 2000)
}
} catch (error: any) {
console.error('关灯重开失败:', error)
// 错误提示由 request 拦截器处理
} finally {
setLoading(false)
}
}
return (
<View className="turn-off-restart-page">
{/* 内容区域 */}
<View className="content-area">
{/* 台球桌信息卡片 */}
<View className="table-card">
{/* 顶部:类型和店名 */}
<View className="card-header">
<Text className="table-type"></Text>
<View className="phone-box" onClick={handlePhoneCall}>
<Image className="phone-icon" src={phoneIcon} mode="aspectFit" />
<Text className="phone-text"></Text>
</View>
</View>
{/* 台球桌标题和使用状态 */}
<View className="table-title-row">
<Text className="table-title">{scanInfo?.tableInfo?.name || '--'}</Text>
<Text className="table-status">{scanInfo?.tableInfo?.statusDescription || '使用中...'}</Text>
</View>
{/* 位置信息 */}
<View className="location-info">
<Image className="location-icon" src={locationIcon} mode="aspectFit" />
<Text className="location-text">{scanInfo?.shopName || '--'}</Text>
</View>
</View>
{/* 温馨提示 */}
<View className="tip-card">
<Text className="tip-label"></Text>
<Text className="tip-text"></Text>
</View>
{/* 开台订单信息卡片 */}
<View className="order-info-card">
{/* 开台方式标签 */}
<View className="order-header">
<View className="order-tag">
<Text className="tag-text"></Text>
</View>
</View>
{/* 订单统计 */}
<View className="order-stats">
<View className="stat-item">
<Text className="stat-value">{opInfo?.usedTime || '--'}</Text>
<Text className="stat-label"></Text>
</View>
<View className="stat-item">
<Text className="stat-value">{opInfo ? `${opInfo.currentAmount.toFixed(2)}` : '--'}</Text>
<Text className="stat-label"></Text>
</View>
</View>
{/* 收费规则 */}
<View className="pricing-rules">
<View className="rules-content">
<Text className="rules-title"></Text>
<View className="price-row">
<View className="price-item">
<Text className="price-label"></Text>
<Text className="price-value">{priceInfo ? `${priceInfo.standard.toFixed(2)}元/小时` : '--'}</Text>
</View>
{priceInfo && priceInfo.memberPrice > 0 && (
<View className="price-item">
<Text className="price-label"></Text>
<Text className="price-value">{priceInfo.memberPrice.toFixed(2)}/</Text>
</View>
)}
</View>
</View>
</View>
</View>
</View>
{/* 底部固定区域 */}
<View className="footer-bar">
<View className={`confirm-btn ${loading ? 'disabled' : ''}`} onClick={handleConfirmSettle}>
<Text className="confirm-text">{loading ? '处理中...' : '确认结算'}</Text>
</View>
</View>
</View>
)
})
export default TurnOffRestart