台球开关台小程序
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.
 
 

213 lines
5.8 KiB

/**
* 关台页面底部按钮组件
*/
import { View, Text } from '@tarojs/components'
import Taro from '@tarojs/taro'
import { useState } from 'react'
import { immediateClose, invokeWechatPay } from '../../../api/startDevice'
import { userStore } from '../../../store'
import './FooterButtons.scss'
interface FooterButtonsProps {
type: 'owner' | 'guest' // owner: 开台人员扫码, guest: 非开台人扫码
grpSn: string // 设备编码
operationId: number // 操作记录ID
}
const FooterButtons = ({ type, grpSn, operationId }: FooterButtonsProps) => {
const [loading, setLoading] = useState(false)
// 立即关台
const handleCloseNow = 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 immediateClose(grpSn, openId)
console.log('关台接口返回:', result)
// 判断是否需要支付(可能需要补差价)
if (result.data.payParameters) {
// 调起微信支付
try {
await invokeWechatPay(result.data.payParameters)
// 支付成功
Taro.showToast({
title: '关台成功',
icon: 'success',
duration: 2000
})
// 跳转到订单详情或首页
setTimeout(() => {
Taro.switchTab({
url: '/pages/index/index'
})
}, 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.switchTab({
url: '/pages/index/index'
})
}, 2000)
}
} catch (error: any) {
console.error('关台失败:', error)
// 错误提示由 request 拦截器处理
} finally {
setLoading(false)
}
}
// 续费
const handleRecharge = () => {
console.log('续费')
Taro.navigateTo({
url: `/pageScan/renewFee/index?grpSn=${grpSn}&operationId=${operationId}`
})
}
// 帮他付款关台
const handlePayForOther = () => {
console.log('帮他付款关台')
Taro.showToast({
title: '功能开发中',
icon: 'none',
duration: 2000
})
}
// AA制付款关台
const handleAAPay = () => {
console.log('AA制付款关台')
Taro.showToast({
title: '功能开发中',
icon: 'none',
duration: 2000
})
}
// 邀请球友
const handleInviteFriend = () => {
console.log('邀请球友')
Taro.showToast({
title: '功能开发中',
icon: 'none',
duration: 2000
})
}
// 关灯重开
const handleTurnOffRestart = () => {
console.log('关灯重开')
Taro.navigateTo({
url: `/pageScan/turnOffRestart/index?grpSn=${grpSn}&operationId=${operationId}`
})
}
return (
<View className="footer-buttons">
{type === 'owner' ? (
<>
{/* 开台人员扫码 - 图1 */}
<View className={`primary-button green ${loading ? 'disabled' : ''}`} onClick={handleCloseNow}>
<Text className="button-text">{loading ? '处理中...' : '立即关台'}</Text>
</View>
<View className="primary-button green" onClick={handleRecharge}>
<Text className="button-text"></Text>
</View>
<View className="secondary-buttons">
<View className="secondary-button" onClick={handleInviteFriend}>
<Text className="secondary-text"></Text>
</View>
<View className="secondary-button right" onClick={handleTurnOffRestart}>
<Text className="secondary-text"></Text>
</View>
</View>
</>
) : (
<>
{/* 非开台人扫码 - 图2 */}
<View className="primary-button green" onClick={handlePayForOther}>
<Text className="button-text"></Text>
</View>
<View className="primary-button green" onClick={handleAAPay}>
<Text className="button-text">AA制付款关台</Text>
</View>
<View className="secondary-buttons">
<View className="secondary-button" onClick={handleInviteFriend}>
<Text className="secondary-text"></Text>
</View>
<View className="secondary-button right" onClick={handleTurnOffRestart}>
<Text className="secondary-text"></Text>
</View>
</View>
</>
)}
</View>
)
}
export default FooterButtons