import React, {useState} from 'react' import {View, Text, Image} from '@tarojs/components' import {Button, Input} 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, decryptQrData} from "@/api/shop/shopGift"; import {useUser} from "@/hooks/useUser"; import type {ShopGift} from "@/api/shop/shopGift/model"; import {isValidJSON} from "@/utils/jsonUtils"; const StoreVerification: React.FC = () => { const { isAdmin } = useUser(); const [scanResult, setScanResult] = useState('') const [verificationCode, setVerificationCode] = useState('') const [giftInfo, setGiftInfo] = useState(null) const [loading, setLoading] = useState(false) // 扫码功能 const handleScan = () => { Taro.scanCode({ success: (res) => { if (res.result) { console.log('扫码结果:', res.result) // 判断是否为JSON格式 if (isValidJSON(res.result)) { setLoading(true) const json = JSON.parse(res.result) console.log(json, 'json') if (json.businessType === 'gift') { // 调用解密接口 handleDecryptAndVerify(json.token, json.data).then() } } } }, fail: (err) => { console.error('扫码失败:', err) Taro.showToast({ title: '扫码失败', icon: 'error' }) } }) } // 调用解密接口 const handleDecryptAndVerify = async (token: string, encryptedData: string) => { decryptQrData({token, encryptedData}).then(res => { const decryptedData = res; console.log('解密结果:', decryptedData) console.log('解密成功:', decryptedData) setScanResult(`${decryptedData}`) setVerificationCode(`${decryptedData}`) handleVerification(`${decryptedData}`) }).catch(() => { console.error('解密失败:') Taro.showToast({ title: `token失效,请刷新二维码重试`, icon: 'none' }) }).finally(() => { setLoading(false) }) } // 验证商品信息 const handleVerification = async (code?: string) => { setGiftInfo(null) setVerificationCode(`${code}`) // 这里应该调用后端API验证核销码 const gift = await getShopGiftByCode(`${code}`) if(gift){ // 设置礼品信息用于显示 setGiftInfo(gift) } } // 手动输入核销码验证 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()) { setLoading(false) return Taro.showToast({ title: '您没有核销权限', icon: 'error' }) } if (gift.status === 1) { setLoading(false) return Taro.showToast({ title: '此礼品码已使用', icon: 'error' }) } if (gift.status === 2) { setLoading(false) return Taro.showToast({ title: '此礼品码已失效', icon: 'error' }) } if (gift.userId === 0) { setLoading(false) return Taro.showToast({ title: '此礼品码未认领', icon: 'error' }) } // 验证成功,设置状态 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) Taro.showToast({ title: '验证失败', icon: 'error' }) } finally { setLoading(false) } } // 重置表单 const resetForm = () => { setScanResult('') setVerificationCode('') setGiftInfo(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 && ( {loading ? '正在解密验证...' : '扫码结果:'} {scanResult} )} {/* 商品信息展示 */} {giftInfo && ( 商品信息 {giftInfo.status === 0 ? '未使用' : giftInfo.status === 1 ? '已使用' : '已过期'} {/* 商品图片 */} {giftInfo.goodsImage && ( )} {/* 商品详情 */} {giftInfo.goodsName || giftInfo.name} 使用门店:{giftInfo.useLocation || '123123'} {giftInfo.description && ( <> {giftInfo.description} )} ¥{giftInfo.faceValue} {giftInfo.type === 10 ? '实物礼品' : giftInfo.type === 20 ? '虚拟礼品' : '服务礼品'} {/* 附加信息 */} {giftInfo.expireTime && ( 有效期至: {dayjs(giftInfo.expireTime).format('YYYY-MM-DD HH:mm')} )} {giftInfo.contactInfo && ( 客服电话: {giftInfo.contactInfo} )} 类型 {getTypeText(giftInfo.type as number)} 兑换码 {giftInfo.code} {giftInfo.operatorUserName && ( 核销人员 {giftInfo.operatorUserName} )} {giftInfo.takeTime && ( 核销时间 {giftInfo.takeTime} )} {giftInfo && giftInfo.status === 0 && ( )} )} {/* 使用说明 */} 操作说明: 1. 用户出示礼品卡二维码 2. 点击"扫描二维码"进行扫码 3. 或手动输入用户提供的核销码 4. 验证成功后点击"确认核销"完成 ) } export default StoreVerification