import { useState, useEffect } from 'react'; import { Input, Button, Card, message, Spin, Result, Tag } from 'antd'; import { QrcodeOutlined, SearchOutlined, ArrowLeftOutlined, CheckCircleOutlined, CloseCircleOutlined, } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import { employeeSerialApi } from '@/services/api'; import type { Serial } from '@/types'; import PublicLayout, { PublicLogo } from '@/components/PublicLayout'; import './styles/PublicQuery.css'; interface EmployeeSerialResult { serialNumber: string; companyName: string; department: string; employeeName: string; isActive: boolean; createdAt: string; } const AFTERSALES_PREFIX = 'zjbf-sh-'; function PublicQueryPage() { const navigate = useNavigate(); const [serialNumber, setSerialNumber] = useState(''); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [error, setError] = useState(null); const [showResult, setShowResult] = useState(false); const [serialType, setSerialType] = useState<'company' | 'employee'>('company'); const isAftersalesSerial = (sn: string) => sn.toLowerCase().startsWith(AFTERSALES_PREFIX); const performQuery = async (serialToQuery: string) => { if (isAftersalesSerial(serialToQuery)) { navigate(`/aftersales/${serialToQuery.toLowerCase()}`, { replace: true }); return; } setLoading(true); setError(null); setResult(null); try { const response = await employeeSerialApi.queryAll(serialToQuery); if (response.type === 'employee') { setSerialType('employee'); setResult(response.data as EmployeeSerialResult); } else { setSerialType('company'); setResult(response.data as Serial); } } catch (err: any) { setError(err.message || '查询失败'); setResult(null); } finally { setLoading(false); } }; useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const serialFromUrl = urlParams.get('serial'); if (serialFromUrl) { if (isAftersalesSerial(serialFromUrl)) { navigate(`/aftersales/${serialFromUrl.toLowerCase()}`, { replace: true }); return; } setSerialNumber(serialFromUrl); setShowResult(true); performQuery(serialFromUrl); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleQuery = async () => { if (!serialNumber.trim()) { message.error('请输入授权序列号'); return; } setShowResult(true); performQuery(serialNumber.trim()); }; const handleReset = () => { setShowResult(false); setSerialNumber(''); setResult(null); setError(null); }; return ( {!showResult ? (

授权查询

请输入您的授权序列号进行查询

setSerialNumber(e.target.value)} onPressEnter={handleQuery} prefix={} />
) : (
{loading ? (

正在查询授权信息...

) : result ? (
{(result as any).isActive === false || (result as any).status === 'inactive' ? ( } title={serialType === 'employee' ? '员工身份已吊销' : '授权已吊销'} subTitle={ serialType === 'employee' ? `序列号验证通过,但已被吊销。企业:${(result as EmployeeSerialResult).companyName}` : `序列号验证通过,但已被吊销。企业:${(result as Serial).companyName}` } /> ) : ( } title={serialType === 'employee' ? '员工身份有效' : '授权有效'} subTitle="您的序列号已验证通过" /> )}
序列号 {result.serialNumber}
企业名称 {result.companyName}
{serialType === 'employee' && (result as EmployeeSerialResult).department && ( <>
职位 {(result as EmployeeSerialResult).department}
员工姓名 {(result as EmployeeSerialResult).employeeName}
)} {serialType !== 'employee' && (result as Serial).validUntil && (
有效期至 {new Date((result as Serial).validUntil).toLocaleString('zh-CN')}
)}
授权状态 {(result as any).isActive === false || (result as any).status === 'inactive' ? '已吊销' : '有效'}
) : (
} title="无效序列号" subTitle={error} />
)}
)}
); } export default PublicQueryPage;