From cef3fe4a431a87c8f10f02ad0f9e275bbb2a030d Mon Sep 17 00:00:00 2001 From: baiyanyun Date: Sun, 7 Jun 2026 01:42:39 +0800 Subject: [PATCH] feat(client): track digital sync retry history --- .../embedded/sgrobot-digital/src/index.css | 53 +++++++ .../src/lib/qimingclawAdapter.ts | 10 ++ .../src/pages/digital/CommandDeck.tsx | 47 +++++++ .../sgrobot-digital/assets/index-BmpavZF5.js | 121 ---------------- .../sgrobot-digital/assets/index-CeOrqzZi.js | 121 ++++++++++++++++ ...{index-DDOlQz2O.css => index-ReBtI0Fy.css} | 2 +- .../public/sgrobot-digital/index.html | 4 +- .../agent-electron-client/src/main/db.ts | 15 ++ .../services/digitalEmployee/syncService.ts | 129 +++++++++++++++++- ...ital-employee-frontend-integration-plan.md | 6 +- 10 files changed, 375 insertions(+), 133 deletions(-) delete mode 100644 qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-BmpavZF5.js create mode 100644 qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-CeOrqzZi.js rename qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/{index-DDOlQz2O.css => index-ReBtI0Fy.css} (55%) diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css index a1bef4dd..b22e0bb0 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css @@ -1698,6 +1698,59 @@ font-size: 13px; line-height: 1.55; } +.de-sync-attempt-history { + display: grid; + gap: 8px; + padding: 14px; + border: 1px solid rgba(126,163,194,0.2); + border-radius: 14px; + background: rgba(247,251,255,0.82); +} +.de-sync-attempt-history > span { + color: #6f8196; + font-size: 12px; + font-weight: 800; +} +.de-sync-attempt-list { + display: grid; + gap: 8px; +} +.de-sync-attempt-row { + display: grid; + gap: 5px; + padding: 9px 10px; + border-radius: 12px; + background: rgba(255,255,255,0.72); +} +.de-sync-attempt-row > div { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 8px; +} +.de-sync-attempt-row strong { + color: #153754; + font-size: 12px; +} +.de-sync-attempt-row em { + font-size: 12px; + font-style: normal; + font-weight: 800; +} +.de-sync-attempt-row span, +.de-sync-attempt-row small { + color: #667b90; + font-size: 12px; +} +.de-sync-attempt-row small { + line-height: 1.45; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-sync-attempt-row--success em { color: #23805d; } +.de-sync-attempt-row--danger em { color: #bb3b3b; } +.de-sync-attempt-row--info em { color: #2e6fa5; } .de-event-modal-actions { display: flex; justify-content: flex-end; diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts index 0b7ed5c1..27f4fe28 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts @@ -64,6 +64,15 @@ interface QimingclawSyncStatus { recentFailures?: QimingclawSyncFailure[]; } +interface QimingclawSyncAttempt { + attemptNo: number; + status: string; + error: string | null; + endpoint?: string | null; + startedAt: string; + finishedAt: string; +} + interface QimingclawSyncFailure { id: string; entityType: string; @@ -74,6 +83,7 @@ interface QimingclawSyncFailure { nextRetryAt?: string | null; dueForRetry?: boolean; managementRecordUrl?: string | null; + attemptHistory?: QimingclawSyncAttempt[]; error: string | null; createdAt: string; updatedAt: string; diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx index 45492686..f97c16c8 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx @@ -64,6 +64,15 @@ interface ManagementSyncStatus { recentFailures?: ManagementSyncFailure[]; } +interface ManagementSyncAttempt { + attemptNo: number; + status: string; + error: string | null; + endpoint?: string | null; + startedAt: string; + finishedAt: string; +} + interface ManagementSyncFailure { id: string; entityType: string; @@ -74,6 +83,7 @@ interface ManagementSyncFailure { nextRetryAt?: string | null; dueForRetry?: boolean; managementRecordUrl?: string | null; + attemptHistory?: ManagementSyncAttempt[]; error: string | null; createdAt: string; updatedAt: string; @@ -495,6 +505,18 @@ function syncFailureRetryTime(failure: ManagementSyncFailure): string { return formatBeijingDateTime(failure.nextRetryAt) || '待计算'; } +function syncAttemptStatusLabel(status: string): string { + if (status === 'synced') return '已同步'; + if (status === 'failed') return '失败'; + return status || '未知'; +} + +function syncAttemptTone(status: string): 'success' | 'danger' | 'info' { + if (status === 'synced') return 'success'; + if (status === 'failed') return 'danger'; + return 'info'; +} + async function readManagementSyncStatus(): Promise { const bridge = window.QimingClawBridge?.digital; if (!bridge?.getSyncStatus) return null; @@ -1837,6 +1859,31 @@ export default function CommandDeck({ onNavigate }: { onNavigate: (target: Digit 失败原因

{selectedSyncFailure.error || '暂无错误详情。'}

+ {(selectedSyncFailure.attemptHistory?.length ?? 0) > 0 && ( +
+ 重试历史 +
+ {selectedSyncFailure.attemptHistory?.map((attempt) => ( +
+
+ 第 {attempt.attemptNo} 次 + {syncAttemptStatusLabel(attempt.status)} + + {formatBeijingDateTime(attempt.finishedAt) || + attempt.finishedAt} + +
+ {attempt.error && {attempt.error}} +
+ ))} +
+
+ )}