/** 扫码干活页 — 编排摄像头扫码 + 手动输入 + 查询结果 */ import { useState, useCallback } from "react"; import { QrCode } from "lucide-react"; import { scanProduct } from "../services/productApi"; import type { ProductScanResponse } from "../types/api"; import CameraScanner from "../components/scan/CameraScanner"; import ManualInput from "../components/scan/ManualInput"; import QueryResult from "../components/scan/QueryResult"; export default function ScanPage() { 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); } }, []); /** 扫码回调:提取纯序列号 */ const handleScan = useCallback( (decodedText: string) => { setCameraError(null); doQuery(decodedText.trim().replace(/[^a-zA-Z0-9]/g, "").slice(0, 16)); }, [doQuery] ); return (

扫码干活

{/* 摄像头扫码 */}
{/* 手动输入 */}
doQuery(serialNumber.trim())} loading={loading} lastScanned={lastScanned} />
{/* 宏观状态栏 */} {product && (
宏观状态 {product.overall_status || "未设定"}
)} {/* 查询结果 */}
); }