import React, { useState } from 'react' import {View, Text, Image} from '@tarojs/components' import {Button, Input, Tag, Divider} from '@nutui/nutui-react-taro' import {Scan, Search} from '@nutui/icons-react-taro' import Taro from '@tarojs/taro' import dayjs from 'dayjs' import {getShopGiftByCode, updateShopGift} from "@/api/shop/shopGift"; import {useUser} from "@/hooks/useUser"; import type { ShopGift } from "@/api/shop/shopGift/model"; const StoreVerification: React.FC = () => { const { isAdmin } = useUser(); const [scanResult, setScanResult] = useState('') const [verificationCode, setVerificationCode] = useState('') const [giftInfo, setGiftInfo] = useState(null) const [verificationResult, setVerificationResult] = useState<'success' | 'failed' | null>(null) const [loading, setLoading] = useState(false) // 扫码功能 const handleScan = () => { Taro.scanCode({ success: (res) => { if (res.result) { setScanResult(res.result) setVerificationCode(res.result) handleManualVerification(res.result) } }, fail: (err) => { console.error('扫码失败:', err) Taro.showToast({ title: '扫码失败', icon: 'error' }) } }) } // 手动输入核销码验证 const handleManualVerification = async (code?: string) => { const codeToVerify = code || verificationCode.trim() if (!codeToVerify) { return false; } setLoading(true) try { // 这里应该调用后端API验证核销码 const gift = await getShopGiftByCode(codeToVerify) // 设置礼品信息用于显示 setGiftInfo(gift) if (!isAdmin()) { setVerificationResult('failed') setLoading(false) return Taro.showToast({ title: '您没有核销权限', icon: 'error' }) } if (gift.status === 1) { setVerificationResult('failed') setLoading(false) return Taro.showToast({ title: '此礼品码已使用', icon: 'error' }) } if (gift.status === 2) { setVerificationResult('failed') setLoading(false) return Taro.showToast({ title: '此礼品码已失效', icon: 'error' }) } if (gift.userId === 0) { setVerificationResult('failed') setLoading(false) return Taro.showToast({ title: '此礼品码未认领', icon: 'error' }) } // 验证成功,设置状态 setVerificationResult('success') await updateShopGift({ ...gift, status: 1, operatorUserId: Number(Taro.getStorageSync('UserId')) || 0, takeTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), verificationTime: dayjs().format('YYYY-MM-DD HH:mm:ss') }) Taro.showToast({ title: '核销成功', icon: 'success' }) // 重置状态 setTimeout(() => { resetForm() }, 2000) } catch (error) { console.error('验证失败:', error) setVerificationResult('failed') Taro.showToast({ title: '验证失败', icon: 'error' }) } finally { setLoading(false) } } // 重置表单 const resetForm = () => { setScanResult('') setVerificationCode('') setGiftInfo(null) setVerificationResult(null) } // 获取类型文本 const getTypeText = (type: number) => { switch (type) { case 10: return '实物礼品卡' case 20: return '虚拟礼品卡' case 30: return '服务礼品卡' default: return '礼品卡' } } // useEffect(() => { // handleManualVerification().then() // },[verificationCode]) return ( {/* 页面标题 */} 礼品卡核销 门店工作人员核销页面 {/* 扫码区域 */} 扫码核销 {/* 扫码结果显示 */} {scanResult && !giftInfo && ( 扫码结果: {scanResult} )} {/* 商品信息展示 */} {giftInfo && ( 商品信息 {giftInfo.status === 0 ? '未使用' : giftInfo.status === 1 ? '已使用' : '已过期'} {/* 商品图片 */} {giftInfo.goodsImage && ( )} {/* 商品详情 */} {giftInfo.goodsName || giftInfo.name} {giftInfo.description && ( {giftInfo.description} )} ¥{giftInfo.faceValue} {giftInfo.type === 10 ? '实物礼品' : giftInfo.type === 20 ? '虚拟礼品' : '服务礼品'} {/* 附加信息 */} {giftInfo.useLocation && ( 使用门店: {giftInfo.useLocation} )} {giftInfo.expireTime && ( 有效期至: {dayjs(giftInfo.expireTime).format('YYYY-MM-DD HH:mm')} )} {giftInfo.contactInfo && ( 客服电话: {giftInfo.contactInfo} )} )} {/* 手动输入区域 */} { !giftInfo && ( 手动输入核销码 ) } {/* 礼品卡信息 */} {giftInfo && ( 礼品卡信息 {verificationResult === 'success' && ( 验证成功 )} {verificationResult === 'failed' && ( 验证失败 )} 商品名称 {giftInfo.goodsName || giftInfo.name} 面值 ¥{giftInfo.faceValue} 类型 {getTypeText(giftInfo.type as number)} 兑换码 {giftInfo.code} {giftInfo.expireTime && ( 有效期至 {dayjs(giftInfo.expireTime).format('YYYY-MM-DD')} )} {giftInfo && ( )} )} {/* 使用说明 */} 操作说明: 1. 用户出示礼品卡二维码 2. 点击"扫描二维码"进行扫码 3. 或手动输入用户提供的核销码 4. 验证成功后点击"确认核销"完成 ) } export default StoreVerification