diff --git a/src/features/workbench/workspace/analysis-document-view.tsx b/src/features/workbench/workspace/analysis-document-view.tsx index a4d5900..1fa843d 100644 --- a/src/features/workbench/workspace/analysis-document-view.tsx +++ b/src/features/workbench/workspace/analysis-document-view.tsx @@ -10,14 +10,12 @@ import { Focus, Map as MapIcon, Minimize2, - PanelRightClose, - PanelRightOpen, ShieldCheck, Sparkles, Trash2, X } from "lucide-react"; -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useState } from "react"; import { showMapNotice } from "@/features/map/core"; import { cn } from "@/shared/ui/cn"; import type { @@ -38,6 +36,8 @@ type AnalysisArtifactWorkspaceProps = { onDestroy: () => void; }; +type EvidenceBlock = Exclude; + export function AnalysisArtifactWorkspace({ artifact, surfaceMode, @@ -48,11 +48,10 @@ export function AnalysisArtifactWorkspace({ }: AnalysisArtifactWorkspaceProps) { const [selectedBlockId, setSelectedBlockId] = useState(null); const metricBlock = artifact.blocks.find((block) => block.kind === "metric-grid"); - const evidenceBlocks = artifact.blocks.filter((block) => block.kind !== "metric-grid"); - const selectedBlock = useMemo( - () => artifact.blocks.find((block) => block.id === selectedBlockId) ?? null, - [artifact.blocks, selectedBlockId] + const evidenceBlocks = artifact.blocks.filter( + (block): block is EvidenceBlock => block.kind !== "metric-grid" ); + const selectedBlock = evidenceBlocks.find((block) => block.id === selectedBlockId) ?? null; useEffect(() => { setSelectedBlockId(null); @@ -118,8 +117,6 @@ export function AnalysisArtifactWorkspace({ artifact={artifact} surfaceMode={surfaceMode} mapSplitAvailable={mapSplitAvailable} - detailOpen={Boolean(selectedBlock)} - onToggleDetail={() => setSelectedBlockId((current) => current ? null : evidenceBlocks[0]?.id ?? null)} onSetView={onSetView} onCollapse={onCollapse} onDestroy={onDestroy} @@ -176,7 +173,7 @@ function AnalysisBlockView({ selected, onSelect }: { - block: Exclude; + block: EvidenceBlock; selected: boolean; onSelect: () => void; }) { @@ -218,7 +215,7 @@ function AnalysisBlockView({ ); } -function AnalysisBlockBody({ block }: { block: Exclude }) { +function AnalysisBlockBody({ block }: { block: EvidenceBlock }) { if (block.kind === "chart") { return (
@@ -286,9 +283,9 @@ function ArtifactProvenance({ artifact }: { artifact: AnalysisArtifact }) {
@@ -313,7 +310,7 @@ function ArtifactDetailDrawer({ onClose }: { artifact: AnalysisArtifact; - block: AnalysisBlock; + block: EvidenceBlock; onClose: () => void; }) { const blockFacts = getEvidenceBlockFacts(block); @@ -321,13 +318,11 @@ function ArtifactDetailDrawer({ return ( ); } -function evidenceBlockKindLabel(block: AnalysisBlock) { +function evidenceBlockDescription(block: EvidenceBlock) { + return "description" in block + ? block.description + : block.paragraphs[0] ?? "该模块汇总了当前成果中的关键判断依据。"; +} + +function evidenceBlockKindLabel(block: EvidenceBlock) { if (block.kind === "chart") return block.chartType === "line" ? "趋势图" : "对比图"; if (block.kind === "process-flow") return "流程证据"; if (block.kind === "data-table") return "明细数据"; - if (block.kind === "narrative") return "分析说明"; - return "指标摘要"; + return "分析说明"; } -function getEvidenceBlockFacts(block: AnalysisBlock): Array<{ label: string; value: string }> { +function getEvidenceBlockFacts(block: EvidenceBlock): Array<{ label: string; value: string }> { if (block.kind === "chart") { return [ { label: "数据序列", value: `${block.series.length} 组` }, { label: "时间 / 类别点", value: `${block.categories.length} 个` }, - { label: "计量单位", value: block.unit }, - { label: "图表类型", value: block.chartType === "line" ? "趋势曲线" : "对比柱图" } + { label: "计量单位", value: block.unit } ]; } if (block.kind === "data-table") { return [ { label: "证据记录", value: `${block.rows.length} 条` }, - { label: "数据字段", value: `${block.columns.length} 个` }, - { label: "展示方式", value: "明细表格" }, - { label: "证据状态", value: "已纳入结论" } + { label: "数据字段", value: `${block.columns.length} 个` } ]; } if (block.kind === "process-flow") { return [ { label: "流程步骤", value: `${block.nodes.length} 项` }, { label: "已完成", value: `${block.nodes.filter((node) => node.status === "complete").length} 项` }, - { label: "当前进行", value: `${block.nodes.filter((node) => node.status === "active").length} 项` }, - { label: "展示方式", value: "处置流程" } + { label: "当前进行", value: `${block.nodes.filter((node) => node.status === "active").length} 项` } ]; } - if (block.kind === "narrative") { - return [ - { label: "分析段落", value: `${block.paragraphs.length} 段` }, - { label: "展示方式", value: "分析说明" }, - { label: "证据状态", value: "已纳入结论" }, - { label: "内容来源", value: "Agent 生成" } - ]; - } - return [ - { label: "关键指标", value: `${block.metrics.length} 项` }, - { label: "展示方式", value: "指标摘要" }, - { label: "证据状态", value: "已纳入结论" }, - { label: "内容来源", value: "Agent 生成" } - ]; + return [{ label: "分析段落", value: `${block.paragraphs.length} 段` }]; } function formatAnalyticalTimeRange(range: AnalysisArtifact["analyticalTimeRange"]) { @@ -479,8 +432,6 @@ function ArtifactActionBar({ artifact, surfaceMode, mapSplitAvailable, - detailOpen, - onToggleDetail, onSetView, onCollapse, onDestroy @@ -488,8 +439,6 @@ function ArtifactActionBar({ artifact: AnalysisArtifact; surfaceMode: WorkbenchSurfaceMode; mapSplitAvailable: boolean; - detailOpen: boolean; - onToggleDetail: () => void; onSetView: (view: ArtifactRequestedView) => void; onCollapse: () => void; onDestroy: () => void; @@ -503,10 +452,6 @@ function ArtifactActionBar({ {surfaceMode === "map_split" ? "专注分析" : "显示地图"} ) : null} -
{artifact.actions.slice(0, 1).map((action) => )}