/** 扫码干活页 — 编排摄像头扫码 + 手动输入 + 查询结果 */ import { useState, useCallback, useEffect, Suspense, lazy } from "react"; import { useSearchParams } from "react-router-dom"; import { QrCode, Loader2 } from "lucide-react"; import { scanProduct } from "../services/productApi"; import type { ProductScanResponse } from "../types/api"; import ManualInput from "../components/scan/ManualInput"; import QueryResult from "../components/scan/QueryResult"; // 🚀 CameraScanner → QrScanner → html5-qrcode (~200KB),仅在首次点开摄像头时加载 const CameraScanner = lazy(() => import("../components/scan/CameraScanner")); export default function ScanPage() { const [searchParams] = useSearchParams(); const [cameraActive, setCameraActive] = useState(false); const [cameraError, setCameraError] = useState(null); const [serialNumber, setSerialNumber] = useState(""); const [lastScanned, setLastScanned] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [product, setProduct] = useState(null); /** 通用查询 */ const doQuery = useCallback(async (sn: string) => { if (sn.length < 8) { setError("产品身份证至少需要 8 位"); return; } setSerialNumber(sn); setLastScanned(sn); setLoading(true); setError(null); setProduct(null); try { setProduct(await scanProduct(sn)); } catch (err: unknown) { const detail = err && typeof err === "object" && "response" in err ? (err as { response?: { data?: { detail?: string } } }).response?.data?.detail : null; setError(detail ?? "网络错误,请检查后端服务"); } finally { setLoading(false); } }, []); // URL 参数自动查询(支持从看板等外部跳转) useEffect(() => { const sn = searchParams.get("sn"); if (sn) doQuery(sn.trim()); }, [searchParams, doQuery]); /** 扫码回调:提取纯产品身份证 */ const handleScan = useCallback( (decodedText: string) => { setCameraError(null); doQuery(decodedText.trim().replace(/[^a-zA-Z0-9]/g, "").slice(0, 16)); }, [doQuery] ); return (

扫码干活

{/* 摄像头扫码 — 点击启动时才动态加载 html5-qrcode */}
} >
{/* 手动输入 */}
doQuery(serialNumber.trim())} loading={loading} lastScanned={lastScanned} />
{/* 宏观状态栏 */} {product && (
宏观状态 {product.overall_status || "未设定"}
)} {/* 查询结果 */}
); }