import React, { useState, useEffect } from 'react' import { View, Text } from '@tarojs/components' import { Button, Popup, Tag } from '@nutui/nutui-react-taro' import { Close, Copy, Share, Refresh, QrCode } from '@nutui/icons-react-taro' import Taro from '@tarojs/taro' import dayjs from 'dayjs' import { generateVerificationCode } from '@/api/shop/shopGift' export interface GiftCardQRCodeProps { /** 是否显示弹窗 */ visible: boolean /** 关闭弹窗回调 */ onClose: () => void /** 礼品卡信息 */ giftCard: { id: number name?: string goodsName?: string code?: string faceValue?: string type?: number status?: number expireTime?: string contactInfo?: string } } const GiftCardQRCode: React.FC = ({ visible, onClose, giftCard }) => { const [loading, setLoading] = useState(false) const [verificationCode, setVerificationCode] = useState('') const [qrData, setQrData] = useState('') // 生成核销码(6位数字) const generateVerificationCode = () => { return Math.random().toString().slice(2, 8) } // 生成二维码数据 const generateQRData = () => { const code = generateVerificationCode() setVerificationCode(code) const data = { type: 'gift_card_verification', giftId: giftCard.id, giftCode: giftCard.code, verificationCode: code, faceValue: giftCard.faceValue, timestamp: Date.now(), expireTime: giftCard.expireTime } const jsonData = JSON.stringify(data) setQrData(jsonData) return jsonData } // 生成二维码(调用后端API) const generateQRCode = async () => { try { setLoading(true) // 调用后端API生成核销码 const result = await generateVerificationCode(giftCard.id) if (result) { setVerificationCode(result.verificationCode) // 生成二维码数据 const data = { type: 'gift_card_verification', giftId: giftCard.id, giftCode: giftCard.code, verificationCode: result.verificationCode, faceValue: giftCard.faceValue, timestamp: Date.now(), expireTime: giftCard.expireTime, codeExpireTime: result.expireTime } setQrData(JSON.stringify(data)) console.log('二维码数据:', data) } } catch (error) { console.error('生成二维码失败:', error) Taro.showToast({ title: '生成核销码失败', icon: 'error' }) } finally { setLoading(false) } } // 复制核销码 const copyVerificationCode = () => { Taro.setClipboardData({ data: verificationCode, success: () => { Taro.showToast({ title: '核销码已复制', icon: 'success' }) } }) } // 复制礼品卡码 const copyGiftCode = () => { if (giftCard.code) { Taro.setClipboardData({ data: giftCard.code, success: () => { Taro.showToast({ title: '兑换码已复制', icon: 'success' }) } }) } } // 分享二维码 const shareQRCode = () => { // 这里可以实现分享功能 Taro.showToast({ title: '分享功能开发中', icon: 'none' }) } // 刷新二维码 const refreshQRCode = () => { generateQRCode() } // 获取状态文本 const getStatusText = (status?: number) => { switch (status) { case 0: return { text: '未使用', color: 'success' } case 1: return { text: '已使用', color: 'warning' } case 2: return { text: '失效', color: 'danger' } default: return { text: '未知', color: 'default' } } } // 获取类型文本 const getTypeText = (type?: number) => { switch (type) { case 10: return '实物礼品卡' case 20: return '虚拟礼品卡' case 30: return '服务礼品卡' default: return '礼品卡' } } // 弹窗打开时生成二维码 useEffect(() => { if (visible && giftCard.id) { generateQRCode() } }, [visible, giftCard.id]) const statusInfo = getStatusText(giftCard.status) return ( } onClose={onClose} style={{ width: '90%', maxWidth: '400px' }} > {/* 标题 */} 礼品卡核销 请向门店工作人员出示此二维码 {/* 礼品卡信息 */} {giftCard.goodsName || giftCard.name} {statusInfo.text} 面值 ¥{giftCard.faceValue} 类型 {getTypeText(giftCard.type)} {giftCard.expireTime && ( 有效期至 {dayjs(giftCard.expireTime).format('YYYY-MM-DD')} )} {/* 二维码区域 */} {loading ? ( 生成中... ) : verificationCode ? ( {/* 模拟二维码显示区域 */} 核销二维码 ID: {giftCard.id} ) : ( 生成失败 )} {/* 核销码 */} {verificationCode && ( 核销码 {verificationCode} )} {/* 兑换码 */} {giftCard.code && ( 兑换码 {giftCard.code} )} {/* 操作按钮 */} {/* 使用说明 */} 使用说明: • 请向门店工作人员出示此二维码或核销码 • 工作人员扫码后即可完成核销 • 每次使用会生成新的核销码,确保安全 • 如有问题请联系客服:{giftCard.contactInfo || '400-800-8888'} ) } export default GiftCardQRCode