📝 回执记录
{loading &&
加载中...
}
- {!loading && receipts.length === 0 &&
暂无回执记录
}
- {receipts.map(rc =>
-
-
-
{rc.result==="success"?"✅":"⚠️"}
-
-
- | 执行者 | {rc.operator} |
- | 时间 | {rc.timestamp} |
-
-
)}
-
- 数据源:guanghutansuohe.com/code/bingshuo/yeye/receipts/
+ {!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]}
;
-}
+}
\ No newline at end of file
diff --git a/src/pages/WorkOrderPage.tsx b/src/pages/WorkOrderPage.tsx
index 1d244ea..e689a3d 100644
--- a/src/pages/WorkOrderPage.tsx
+++ b/src/pages/WorkOrderPage.tsx
@@ -1,6 +1,6 @@
import React, { useEffect, useState } from "react";
import { WorkOrder } from "../lib/types";
-import { fetchWorkOrders, loadDrafts, saveDrafts, createDraftWorkOrder } from "../lib/api";
+import { fetchWorkOrders, loadDrafts, saveDrafts, createDraftWorkOrder, writeReceiptToRepo } from "../lib/api";
export function WorkOrderPage() {
const [orders, setOrders] = useState
([]);
@@ -30,8 +30,34 @@ export function WorkOrderPage() {
await load();
}
- function handleAuthorize(id: string, decision: "approved" | "rejected") {
+ async function handleAuthorize(id: string, decision: "approved" | "rejected") {
setAuthorizations(prev => ({ ...prev, [id]: decision }));
+ const order = orders.find(o => o.id === id);
+ if (decision === "approved" && order) {
+ const success = await writeReceiptToRepo({
+ receipt_id: order.id, operation: order.summary,
+ operator: "小线 · PER-YE-LN-001", timestamp: new Date().toISOString(),
+ result: "success", status: "completed", scope: order.scope,
+ });
+ if (success) {
+ const drafts = loadDrafts().filter(d => d.id !== id);
+ saveDrafts(drafts);
+ await load();
+ }
+ }
+ }
+
+ function handleDeleteDraft(id: string) {
+ if (!confirm("确认删除这条本地草稿?")) return;
+ const drafts = loadDrafts().filter(d => d.id !== id);
+ saveDrafts(drafts);
+ load();
+ }
+
+ function handleClearAllDrafts() {
+ if (!confirm("确认清空所有本地草稿?")) return;
+ saveDrafts([]);
+ load();
}
const filtered = filter === "all" ? orders : orders.filter(o => o.status === filter);
@@ -73,6 +99,7 @@ export function WorkOrderPage() {
{f==="all"?"全部":f==="draft"?"草稿":f==="executing"?"执行中":"已完成"} ({counts[f]})
))}
+ {counts.draft > 0 && }
加载中...
}
@@ -125,6 +152,11 @@ export function WorkOrderPage() {
{needsAuth && authState !== "pending" &&
{authState==="approved" ? "✅ 已批准 · 单次执行 · 有效期 24 小时" : "⛔ 已拒绝"}