feat(selection): 重构选股结果筛选与状态入口

This commit is contained in:
yuxuanhui
2026-08-10 14:50:56 +08:00
parent 78be0f53d4
commit 8d4f80f2f1
17 changed files with 1123 additions and 156 deletions
@@ -1,9 +1,8 @@
import { XIcon } from "lucide-react"
import type { RefObject } from "react"
import type { SelectionResults } from "../api/selection.types"
import { IncompleteEvaluationTable } from "./incomplete-evaluation-table"
import { getSelectionRunStatusPresentation } from "./selection-presentation"
import { Badge } from "@/shared/ui/badge"
import { Button } from "@/shared/ui/button"
import {
Dialog,
DialogClose,
@@ -13,7 +12,10 @@ import {
DialogHeader,
DialogTitle,
} from "@/shared/ui/dialog"
import { Button } from "@/shared/ui/button"
import type { SelectionResults } from "../api/selection.types"
import { IncompleteEvaluationTable } from "./incomplete-evaluation-table"
import { getSelectionRunStatusPresentation } from "./selection-presentation"
interface ExecutionStatusDrawerProps {
finalFocus: RefObject<HTMLElement | null>
@@ -50,6 +52,37 @@ export function ExecutionStatusDrawer({
</DialogHeader>
<div className="min-h-0 flex-1 overflow-y-auto py-4">
<section
aria-label="执行摘要"
className="mb-4 rounded-lg border border-border/70 bg-muted/20 p-3"
>
<h2 className="sr-only">执行摘要</h2>
<dl className="grid grid-cols-2 gap-x-4 gap-y-3 sm:grid-cols-3">
<SummaryMetric label="目标股票数" value={result.target_count} />
<SummaryMetric label="实际参与数" value={result.eligible_count} />
<SummaryMetric
label="命中股票数"
value={result.selected_stock_count}
/>
<SummaryMetric label="信号条数" value={result.signal_count} />
<SummaryMetric
label="数据覆盖率"
value={`${(result.coverage * 100).toFixed(2)}%`}
/>
<div className="space-y-1">
<dt className="text-[11px] text-muted-foreground">执行状态</dt>
<dd>
{statusPresentation ? (
<Badge variant={statusPresentation.variant}>
{statusLabel}
</Badge>
) : (
<span className="text-sm font-semibold">{statusLabel}</span>
)}
</dd>
</div>
</dl>
</section>
<IncompleteEvaluationTable failures={result.failures} />
</div>
@@ -73,3 +106,20 @@ export function ExecutionStatusDrawer({
</Dialog>
)
}
function SummaryMetric({
label,
value,
}: {
label: string
value: number | string
}) {
return (
<div className="space-y-1">
<dt className="text-[11px] text-muted-foreground">{label}</dt>
<dd className="text-base font-semibold tracking-tight tabular-nums">
{value}
</dd>
</div>
)
}