From 8b952c9a2614b7c72b60122edae55fdbe4001b61 Mon Sep 17 00:00:00 2001 From: Codex Date: Sat, 13 Jun 2026 14:52:26 +0000 Subject: [PATCH] refactor(travel): split reimbursement create workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完整修改内容: - 拆分 TravelReimbursementCreateView:提取审核面板纯模型、消息操作、建议动作处理、生命周期 watcher/UI 映射、小财管家运行时、续办流程和运行时文本模型,减少主组件继续堆叠业务分支。 - 调整申请预览链路:新增本地申请意图 gate,完善复杂差旅申请的大模型复核判断、交通方式缺失/候选识别、规则中心交通费用预估合并和申请冲突处理。 - 优化小财管家流程:抽出 steward typewriter 分段策略,避免 Markdown 表格逐字闪烁;补齐跨助手 carry、字段补齐续办、文本确认提交和行程规划推荐动作。 - 调整消息与样式:移除申请预览日期 chip 样式,收敛申请卡片/报销草稿消息的展示与复制、朗读、反馈入口逻辑。 - 更新测试:将源码锚点迁移到新模块,覆盖申请预览、提交确认、小财管家续办、引导流和审核抽屉相关断言。 验证: - node --check web/src/views/scripts/TravelReimbursementCreateView.js 及新增拆分模块 - npm --prefix web run build - node --test web/tests/expense-application-fast-preview.test.mjs web/tests/expense-application-submit-rich-confirm.test.mjs web/tests/travel-reimbursement-guided-flow.test.mjs 说明: - 后端/规则/容器配置/Audit 页面等工作区已有改动未纳入本提交。 - 容器内后端定向 pytest 曾运行 timeout 180s /tmp/x-financial-server-venv/bin/pytest -q <相关后端测试>,180 秒超时且超时前已有失败标记,未作为通过项记录。 - TravelReimbursementCreateView 当前仍超过 800 行,后续仍需继续拆分;本提交先把新增职责模块控制在 800 行内,阻止主类/主模块继续膨胀。 --- ...avel-reimbursement-message-application.css | 11 - .../travel-reimbursement-message-item.css | 46 +- .../travel/TravelReimbursementMessageItem.vue | 1 - web/src/utils/assistantSessionScope.js | 101 +- web/src/utils/expenseApplicationEstimate.js | 6 +- web/src/utils/expenseApplicationIntentGate.js | 93 + web/src/utils/expenseApplicationOntology.js | 53 +- web/src/utils/expenseApplicationPreview.js | 405 ++- .../scripts/TravelReimbursementCreateView.js | 2785 ++--------------- .../scripts/stewardFieldCompletionModel.js | 2 +- web/src/views/scripts/stewardPlanModel.js | 7 - web/src/views/scripts/stewardTypewriter.js | 103 + .../travelReimbursementReviewPanelModel.js | 322 ++ .../travelReimbursementStewardFollowupFlow.js | 255 ++ ...velReimbursementStewardRuntimeTextModel.js | 77 + .../scripts/useApplicationPreviewEditor.js | 9 - web/src/views/scripts/useStewardPlanFlow.js | 8 +- ...eTravelReimbursementCreateViewLifecycle.js | 241 ++ .../useTravelReimbursementCreateViewUi.js | 145 + .../scripts/useTravelReimbursementFlow.js | 4 +- .../useTravelReimbursementMessageActions.js | 476 +++ .../useTravelReimbursementStewardRuntime.js | 775 +++++ .../useTravelReimbursementSubmitComposer.js | 124 +- .../useTravelReimbursementSuggestedActions.js | 447 +++ .../expense-application-fast-preview.test.mjs | 652 +++- ...e-application-submit-rich-confirm.test.mjs | 28 +- .../travel-reimbursement-guided-flow.test.mjs | 10 +- ...eimbursement-review-drawer-switch.test.mjs | 54 +- 28 files changed, 4510 insertions(+), 2730 deletions(-) create mode 100644 web/src/utils/expenseApplicationIntentGate.js create mode 100644 web/src/views/scripts/stewardTypewriter.js create mode 100644 web/src/views/scripts/travelReimbursementReviewPanelModel.js create mode 100644 web/src/views/scripts/travelReimbursementStewardFollowupFlow.js create mode 100644 web/src/views/scripts/travelReimbursementStewardRuntimeTextModel.js create mode 100644 web/src/views/scripts/useTravelReimbursementCreateViewLifecycle.js create mode 100644 web/src/views/scripts/useTravelReimbursementCreateViewUi.js create mode 100644 web/src/views/scripts/useTravelReimbursementMessageActions.js create mode 100644 web/src/views/scripts/useTravelReimbursementStewardRuntime.js create mode 100644 web/src/views/scripts/useTravelReimbursementSuggestedActions.js diff --git a/web/src/assets/styles/components/travel-reimbursement-message-application.css b/web/src/assets/styles/components/travel-reimbursement-message-application.css index 244bda9..7ccf139 100644 --- a/web/src/assets/styles/components/travel-reimbursement-message-application.css +++ b/web/src/assets/styles/components/travel-reimbursement-message-application.css @@ -1,14 +1,3 @@ -.application-preview-date-chip { - display: inline-flex; - align-items: center; - min-height: 24px; - padding: 0 8px; - border-radius: 999px; - background: rgba(var(--theme-primary-rgb, 58, 124, 165), 0.1); - color: var(--theme-primary-active, #255b7d); - font-weight: 850; -} - .application-draft-preview { width: min(100%, 620px); max-width: 620px; diff --git a/web/src/assets/styles/components/travel-reimbursement-message-item.css b/web/src/assets/styles/components/travel-reimbursement-message-item.css index b223fde..93b3b81 100644 --- a/web/src/assets/styles/components/travel-reimbursement-message-item.css +++ b/web/src/assets/styles/components/travel-reimbursement-message-item.css @@ -532,10 +532,11 @@ .message-answer-markdown :deep(table) { width: 100%; - min-width: 460px; + min-width: 560px; border: 0; border-collapse: separate; border-spacing: 0; + table-layout: fixed; background: #ffffff; font-size: inherit; } @@ -547,6 +548,25 @@ text-align: left; vertical-align: top; white-space: normal; + word-break: normal; + overflow-wrap: break-word; +} + +.message-answer-markdown :deep(th:first-child), +.message-answer-markdown :deep(td:first-child) { + width: 88px; + white-space: nowrap; + word-break: keep-all; + overflow-wrap: normal; +} + +.message-answer-markdown :deep(th:last-child), +.message-answer-markdown :deep(td:last-child) { + width: 112px; + text-align: right; + white-space: nowrap; + word-break: keep-all; + overflow-wrap: normal; } .message-answer-markdown :deep(th) { @@ -786,30 +806,6 @@ border-top: 1px solid #e6edf5; } -.structured-card-reveal-enter-active .application-preview-row { - animation: structured-card-item-reveal 260ms cubic-bezier(0.22, 1, 0.36, 1) both; -} - -.structured-card-reveal-enter-active .application-preview-row:nth-child(2) { - animation-delay: 35ms; -} - -.structured-card-reveal-enter-active .application-preview-row:nth-child(3) { - animation-delay: 70ms; -} - -.structured-card-reveal-enter-active .application-preview-row:nth-child(4) { - animation-delay: 105ms; -} - -.structured-card-reveal-enter-active .application-preview-row:nth-child(5) { - animation-delay: 140ms; -} - -.structured-card-reveal-enter-active .application-preview-row:nth-child(n + 6) { - animation-delay: 165ms; -} - .application-preview-row.editable { cursor: pointer; } diff --git a/web/src/components/travel/TravelReimbursementMessageItem.vue b/web/src/components/travel/TravelReimbursementMessageItem.vue index 18c5738..33496a6 100644 --- a/web/src/components/travel/TravelReimbursementMessageItem.vue +++ b/web/src/components/travel/TravelReimbursementMessageItem.vue @@ -207,7 +207,6 @@