From 5e1765d8896bcf960151777891097510203baf0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=87=AF?= Date: Wed, 19 Aug 2026 12:12:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=208BF=20=E4=BC=9A?= =?UTF-8?q?=E5=95=86=E7=AC=AC=E4=B8=80=E6=AD=A5=E4=BA=A7=E7=89=A9=E4=B8=8E?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E4=BD=93=E5=88=97=E8=A1=A8=EF=BC=8C=E7=AC=AC?= =?UTF-8?q?=E4=BA=8C=E6=AD=A5=E5=AF=B9=E8=AF=9D=E5=8C=BA=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AD=A5=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 抽出共用分析成果卡片,第一步展示第二、三步 Markdown 产物;智能体列表对齐岗位会商选择样式。第二步对话面板改为深蓝顶栏,第一步保留可配置返回按钮。 Co-authored-by: Cursor --- frontend-web/public/runtime-config.js | 4 + .../assets/eightbf-roundtable/back-arrow.svg | 3 + .../AnalysisResultCardList.tsx | 104 ++++++ .../AnalysisResultDetailDialog.tsx | 141 +++++++ .../analysis-results/analysis-results.css | 130 +++++++ .../src/components/analysis-results/index.ts | 3 + .../src/components/analysis-results/types.ts | 17 + .../eightbf-roundtable/api/task-context.ts | 5 + .../components/EightBfStep1Workspace.tsx | 186 +++++++--- .../lib/collect-md-artifacts.ts | 343 ++++++++++++++++++ .../pages/EightBfRoundtablePage.tsx | 1 + .../src/eightbf-roundtable/styles/step1.css | 215 ++++++++--- .../src/eightbf-roundtable/styles/step2.css | 40 ++ .../pages/PositionRoundtablePage.tsx | 119 ++---- .../styles/intent-understanding.css | 28 +- .../components/Step2Panel.tsx | 125 +++++-- .../pages/RoundtablePlanningPage.tsx | 20 + 17 files changed, 1254 insertions(+), 230 deletions(-) create mode 100644 frontend-web/src/assets/eightbf-roundtable/back-arrow.svg create mode 100644 frontend-web/src/components/analysis-results/AnalysisResultCardList.tsx create mode 100644 frontend-web/src/components/analysis-results/AnalysisResultDetailDialog.tsx create mode 100644 frontend-web/src/components/analysis-results/analysis-results.css create mode 100644 frontend-web/src/components/analysis-results/index.ts create mode 100644 frontend-web/src/components/analysis-results/types.ts create mode 100644 frontend-web/src/eightbf-roundtable/lib/collect-md-artifacts.ts diff --git a/frontend-web/public/runtime-config.js b/frontend-web/public/runtime-config.js index e24ea0c7..b9e96530 100644 --- a/frontend-web/public/runtime-config.js +++ b/frontend-web/public/runtime-config.js @@ -54,6 +54,10 @@ window.__CM_RUNTIME_CONFIG__ = { // 不影响原多智能体会商使用的任务详情接口。 VITE_8BF_TASK_API_BASE_URL: "https://ch1.b.uat.4.cn/zncm", + // 8BF 会商页右上角「返回」按钮的跳转地址(当前窗口 window.location.href)。 + // 部署后直接改 dist/runtime-config.js 即可,无需重新打包。留空则点击时提示未配置。 + VITE_8BF_ROUNDTABLE_BACK_URL: "", + // 佳来模型对话接口。 VITE_AIPI_CHAT_URL: "https://ch1.b.uat.4.cn/gpt", diff --git a/frontend-web/src/assets/eightbf-roundtable/back-arrow.svg b/frontend-web/src/assets/eightbf-roundtable/back-arrow.svg new file mode 100644 index 00000000..801cd281 --- /dev/null +++ b/frontend-web/src/assets/eightbf-roundtable/back-arrow.svg @@ -0,0 +1,3 @@ + diff --git a/frontend-web/src/components/analysis-results/AnalysisResultCardList.tsx b/frontend-web/src/components/analysis-results/AnalysisResultCardList.tsx new file mode 100644 index 00000000..2788cf70 --- /dev/null +++ b/frontend-web/src/components/analysis-results/AnalysisResultCardList.tsx @@ -0,0 +1,104 @@ +import { FileOutput } from "lucide-react"; +import { toast } from "sonner"; + +import responsibilityIcon from "@/assets/position-roundtable/责任岗位.svg"; +import resultTimeIcon from "@/assets/position-roundtable/时间.svg"; +import { desensitize } from "@/lib/desensitize"; +import { cn } from "@/lib/utils"; + +import "./analysis-results.css"; +import type { AnalysisResultCardItem } from "./types"; + +function formatResultTime(value: string | undefined, fallback: string): string { + if (!value) return fallback; + const date = new Date(value); + if (Number.isNaN(date.getTime())) return value; + return new Intl.DateTimeFormat("zh-CN", { + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + hour12: false, + }).format(date); +} + +export function AnalysisResultCardList({ + items, + emptyTitle = "暂无交付产物", + emptyDescription = "第二步研讨与第三步总结生成 Markdown 后,产物会显示在这里。", + padded = true, + onOpen, +}: { + items: AnalysisResultCardItem[]; + emptyTitle?: string; + emptyDescription?: string; + padded?: boolean; + onOpen: (item: AnalysisResultCardItem) => void; +}) { + if (items.length === 0) { + return ( +
+ +

{emptyTitle}

+

+ {emptyDescription} +

+
+ ); + } + + return ( +
+ {items.map((item, index) => { + const displayedTime = formatResultTime( + item.updatedAt, + item.fallbackTime || "刚刚", + ); + const displayedProductName = item.delivered ? item.productName : "未交付"; + return ( +