import React, { useEffect, useState } from "react"; import { fetchReceipts, ApiReceipt } from "../lib/api"; import { Page } from "../lib/types"; interface Props { onNavigate?: (page: Page) => void; } export function ReceiptPage({ onNavigate }: Props) { const [receipts, setReceipts] = useState([]); const [loading, setLoading] = useState(true); const [expanded, setExpanded] = useState(null); const [search, setSearch] = useState(""); async function load() { setLoading(true); try { const data = await fetchReceipts(); setReceipts(data); } catch {} setLoading(false); } useEffect(() => { load(); }, []); const filtered = search ? receipts.filter(r => r.id.toLowerCase().includes(search.toLowerCase()) || r.operation.toLowerCase().includes(search.toLowerCase())) : receipts; const counts = { all: receipts.length, success: receipts.filter(r => r.result === "success").length, failed: receipts.filter(r => r.result !== "success").length }; return

📝 回执记录

{counts.all}
全部
{counts.success}
已成功
{counts.failed}
待处理
setSearch(e.target.value)} />
{loading &&

加载中...

} {!loading && filtered.length === 0 &&

{search ? "无匹配回执" : "暂无回执记录"}

} {filtered.map(rc => { const isExpanded = expanded === rc.id; return
setExpanded(isExpanded ? null : rc.id)}>
{rc.id}
{rc.operation}
{rc.result==="success"?"✅ 已成功":"⚠️ 待验证"}
{isExpanded &&
执行者{rc.operator}
完成时间{rc.timestamp}
状态{rc.result === "success" ? "成功闭环 ✅" : "需跟进 ⚠️"}
关联工单 {onNavigate && } {rc.id.replace("RC-","WO-")}
证据链 yeye 仓库 receipts/ 目录 Git 历史可追溯
HLDP 回执链 · 工单 → 执行 → 结果 → 证据 · 不可静默覆盖
}
{isExpanded ? "▲ 收起" : "▼ 展开详情"} · {rc.timestamp?.split("T")[0] || "—"}
; })}
数据源:guanghutansuohe.com/code/bingshuo/yeye/receipts/ · 最后同步 {new Date().toISOString().split("T")[0]}
; }