From 27fffbec617d262b65fda46de927acf934b1745e Mon Sep 17 00:00:00 2001 From: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com> Date: Thu, 25 Jun 2026 18:08:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BC=9A=E5=95=86=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E6=AD=A5):=20=E5=88=86=E6=9E=90=E8=AE=B0=E5=BD=95=E6=8C=89?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E9=93=BE=E7=AD=9B=E9=80=89(=E6=BC=8F?= =?UTF-8?q?=E6=96=97=E4=B8=8B=E6=8B=89,=20=E9=80=89=E9=A1=B9=E4=BB=8E?= =?UTF-8?q?=E8=8D=89=E7=A8=BFchainTitle=E5=8E=BB=E9=87=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../pages/RoundtablePlanningPage.tsx | 97 ++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/frontend-web/src/roundtable-planning/pages/RoundtablePlanningPage.tsx b/frontend-web/src/roundtable-planning/pages/RoundtablePlanningPage.tsx index a4e1c536..0c33fc0d 100644 --- a/frontend-web/src/roundtable-planning/pages/RoundtablePlanningPage.tsx +++ b/frontend-web/src/roundtable-planning/pages/RoundtablePlanningPage.tsx @@ -40,6 +40,7 @@ import { Clock, Cpu, Download, + Filter, History, Layers, ListOrdered, @@ -61,6 +62,14 @@ import { import { useTheme } from "@/contexts/ThemeContext"; import { useArtifacts } from "@/components/workspace/artifacts"; import { useSidebarSafe } from "@/components/ui/sidebar"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; import { desensitize } from "@/lib/desensitize"; import { cn } from "@/lib/utils"; import { useDesensitizeSubtree } from "@/roundtable-planning/lib/use-desensitize-subtree"; @@ -2860,6 +2869,10 @@ function getChainStageGroups(chain: BusinessChain): BusinessChain["seats"][] { return chain.seats.map((s) => [s]); } +/** 分析记录「按业务链筛选」的两个特殊值:全部 / 无业务链(自由模式)。 */ +const RECORD_FILTER_ALL = "__all__"; +const RECORD_FILTER_FREE = "__free__"; + /** * 需求 0616 #2:多智能体会商 Step1(落地)左栏入口栏。 * - 业务链:仅公共链条(``listChains("public")``)前 3 个;点击以该链席位启动会商。 @@ -2886,6 +2899,38 @@ function RoundtableEntryRail({ const [chains, setChains] = useState([]); const [expandedChainId, setExpandedChainId] = useState(null); const { drafts: records, refresh } = useRoundtableDrafts(taskId); + // 分析记录「按业务链筛选」—— 选项从已加载草稿的 chainTitle 去重得到, + // 无业务链的草稿(自由 / recommend 模式)归入「自由模式」。 + const [chainFilter, setChainFilter] = useState(RECORD_FILTER_ALL); + const chainFilterOptions = useMemo(() => { + const titles = new Set(); + let hasFree = false; + for (const rec of records) { + const title = rec.chainTitle?.trim(); + if (title) titles.add(title); + else hasFree = true; + } + const opts = Array.from(titles) + .sort((a, b) => a.localeCompare(b, "zh-CN")) + .map((title) => ({ value: title, label: title })); + if (hasFree) opts.push({ value: RECORD_FILTER_FREE, label: "自由模式" }); + return opts; + }, [records]); + const filteredRecords = useMemo(() => { + if (chainFilter === RECORD_FILTER_ALL) return records; + if (chainFilter === RECORD_FILTER_FREE) + return records.filter((rec) => !rec.chainTitle?.trim()); + return records.filter((rec) => rec.chainTitle?.trim() === chainFilter); + }, [records, chainFilter]); + // 草稿刷新后所选业务链可能已不存在(被删/改名)→ 回落到「全部」,避免列表空白无解。 + useEffect(() => { + if ( + chainFilter !== RECORD_FILTER_ALL && + !chainFilterOptions.some((opt) => opt.value === chainFilter) + ) { + setChainFilter(RECORD_FILTER_ALL); + } + }, [chainFilter, chainFilterOptions]); // 深链接(taskId)模式:左上角不显示「业务链选择」(链条已由 businessCode 自动决定),改为展示 // 当前任务(rwfx/3qfx)或当前行动(xdfx)。xdfx 的根是「行动」,故展示行动名称 + 叙事。 const deeplink = Boolean(taskId); @@ -3159,13 +3204,59 @@ function RoundtableEntryRail({

分析记录

+ {/* 按业务链筛选 —— 仅当存在多于 1 个可选业务链时才显示图标按钮。 */} + {chainFilterOptions.length > 1 && ( + + + + + + + 按业务链筛选 + + + + 全部 + + {chainFilterOptions.map((opt) => ( + + {opt.label} + + ))} + + + + )} {records.length === 0 ? (

暂无分析记录

+ ) : filteredRecords.length === 0 ? ( +

+ 该业务链下暂无分析记录 +

) : ( <>
- {records.map((rec) => { + {filteredRecords.map((rec) => { // 已完成:进行到第 3 步(执行过方案总结报告) const completed = rec.furthestStep === 3; // 选中:当前已加载的草稿(正在查看的那条) @@ -3230,7 +3321,9 @@ function RoundtableEntryRail({ })}
- 共 {records.length} 条分析记录 + {chainFilter === RECORD_FILTER_ALL + ? `共 ${records.length} 条分析记录` + : `筛选出 ${filteredRecords.length} / ${records.length} 条分析记录`}
)}