From e725b7f19ca2c4fc80c5b5709c4135a547e78963 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Tue, 23 Jun 2026 09:42:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E7=A5=A8=E6=8D=AE=E5=A4=B9?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E7=BC=93=E5=AD=98=E6=8E=A5=E5=85=A5=E4=B8=8E?= =?UTF-8?q?=20AI=20=E5=B7=A5=E4=BD=9C=E5=8F=B0=E9=99=84=E4=BB=B6=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReceiptFolderView 删除票据后提示已关联附件副本保留,接入 useToast;fetchReceiptFolderAsset 加 no-store 避免预览缓存 - PersonalWorkbenchAiMode 附件区/对话气泡适配资产缓存,personal-workbench-ai-mode.css 调整布局 - usePersonalWorkbenchAiMode/useWorkbenchAiApplicationPreviewFlow/useWorkbenchAiAttachmentAssociationFlow/useWorkbenchAiStewardFlow 完善附件草稿选择与关联流程 - travelRequestDetailSmartEntryRecognition 智能识别增强,AppShellRouteView/PersonalWorkbenchView/useApplicationPreviewEditor/useTravelReimbursementSubmitComposer 等配套适配 - 新增 expense-attachment-draft-selection、receipt-folder-asset-cache、travel-request-detail-smart-entry-recognition 测试,更新 attachment-association-confirmation、expense-application-fast-preview、workbench-ai-mode-switch 测试 --- .../components/personal-workbench-ai-mode.css | 71 ++++- .../PersonalWorkbenchAiMode.template.html | 42 ++- .../business/PersonalWorkbenchAiMode.vue | 4 +- .../usePersonalWorkbenchAiMode.js | 17 +- .../useWorkbenchAiApplicationPreviewFlow.js | 31 ++- ...useWorkbenchAiAttachmentAssociationFlow.js | 255 ++++++++++++++++-- .../useWorkbenchAiStewardFlow.js | 7 +- web/src/services/receiptFolder.js | 1 + web/src/views/AppShellRouteView.vue | 1 + web/src/views/PersonalWorkbenchView.vue | 3 +- web/src/views/ReceiptFolderView.vue | 3 + .../travelReimbursementAttachmentModel.js | 28 +- ...ravelRequestDetailSmartEntryRecognition.js | 21 +- .../scripts/useApplicationPreviewEditor.js | 63 ++++- ...seTravelReimbursementCreateViewControls.js | 6 +- .../useTravelReimbursementSubmitComposer.js | 58 ++-- ...tachment-association-confirmation.test.mjs | 30 +++ .../expense-application-fast-preview.test.mjs | 74 +++++ ...xpense-attachment-draft-selection.test.mjs | 90 +++++++ web/tests/receipt-folder-asset-cache.test.mjs | 14 + ...st-detail-smart-entry-recognition.test.mjs | 35 +++ web/tests/workbench-ai-mode-switch.test.mjs | 66 ++++- 22 files changed, 850 insertions(+), 70 deletions(-) create mode 100644 web/tests/expense-attachment-draft-selection.test.mjs create mode 100644 web/tests/receipt-folder-asset-cache.test.mjs create mode 100644 web/tests/travel-request-detail-smart-entry-recognition.test.mjs diff --git a/web/src/assets/styles/components/personal-workbench-ai-mode.css b/web/src/assets/styles/components/personal-workbench-ai-mode.css index b5942ab..38a39f7 100644 --- a/web/src/assets/styles/components/personal-workbench-ai-mode.css +++ b/web/src/assets/styles/components/personal-workbench-ai-mode.css @@ -542,6 +542,48 @@ letter-spacing: 0; } +.workbench-ai-file-card__ocr { + max-width: 100%; + display: inline-flex; + align-items: center; + gap: 4px; + color: #2563eb; + font-size: 12px; + font-weight: 800; + line-height: 1.2; +} + +.workbench-ai-file-card__ocr i { + flex: 0 0 auto; + font-size: 14px; + line-height: 1; +} + +.workbench-ai-file-card__ocr span { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.workbench-ai-file-card__ocr.is-recognizing i { + animation: workbenchAiOcrSpin 840ms linear infinite; +} + +.workbench-ai-file-card__ocr.is-recognized { + color: #047857; +} + +.workbench-ai-file-card__ocr.is-failed { + color: #dc2626; +} + +@keyframes workbenchAiOcrSpin { + to { + transform: rotate(360deg); + } +} + .workbench-ai-file-card__remove { width: 30px; height: 30px; @@ -2035,7 +2077,7 @@ } .application-preview-input { - width: 100%; + width: min(100%, 420px); min-width: 0; min-height: 34px; padding: 0 10px; @@ -2049,7 +2091,34 @@ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.11); } +.application-preview-date-input { + width: min(100%, 188px); + color-scheme: light; +} + +.application-preview-input--time, +.application-preview-input--time_return { + width: min(100%, 188px); +} + +.application-preview-input--location { + width: min(100%, 220px); +} + +.application-preview-input--reason { + width: min(100%, 680px); +} + +.application-preview-input--days { + width: min(100%, 150px); +} + +.application-preview-input--transportMode { + width: min(100%, 240px); +} + .application-preview-select { + width: min(100%, 240px); cursor: pointer; } diff --git a/web/src/components/business/PersonalWorkbenchAiMode.template.html b/web/src/components/business/PersonalWorkbenchAiMode.template.html index 2cc99ea..7a86e7a 100644 --- a/web/src/components/business/PersonalWorkbenchAiMode.template.html +++ b/web/src/components/business/PersonalWorkbenchAiMode.template.html @@ -182,6 +182,17 @@ {{ file.name }} {{ file.typeLabel }} + + + + + {{ file.ocrState.label }} +