From ade1713e865c29cce0b8ffc20e23c01a52998476 Mon Sep 17 00:00:00 2001 From: yuxuanhui Date: Sat, 5 Sep 2026 19:48:41 +0800 Subject: [PATCH] docs(trellis): record selection layout and sector filter task --- .../check.jsonl | 1 + .../implement.jsonl | 1 + .../prd.md | 40 +++++++++++++++++++ .../task.json | 26 ++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 .trellis/tasks/09-05-selection-layout-sector-filter/check.jsonl create mode 100644 .trellis/tasks/09-05-selection-layout-sector-filter/implement.jsonl create mode 100644 .trellis/tasks/09-05-selection-layout-sector-filter/prd.md create mode 100644 .trellis/tasks/09-05-selection-layout-sector-filter/task.json diff --git a/.trellis/tasks/09-05-selection-layout-sector-filter/check.jsonl b/.trellis/tasks/09-05-selection-layout-sector-filter/check.jsonl new file mode 100644 index 0000000..9dd3234 --- /dev/null +++ b/.trellis/tasks/09-05-selection-layout-sector-filter/check.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/09-05-selection-layout-sector-filter/implement.jsonl b/.trellis/tasks/09-05-selection-layout-sector-filter/implement.jsonl new file mode 100644 index 0000000..9dd3234 --- /dev/null +++ b/.trellis/tasks/09-05-selection-layout-sector-filter/implement.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/09-05-selection-layout-sector-filter/prd.md b/.trellis/tasks/09-05-selection-layout-sector-filter/prd.md new file mode 100644 index 0000000..2a5e701 --- /dev/null +++ b/.trellis/tasks/09-05-selection-layout-sector-filter/prd.md @@ -0,0 +1,40 @@ +# 选股页面迭代:布局重构与板块筛选 + +## 需求 + +1. 选股页面从左右布局改为「上搜索栏 + 左列表 / 右详情」三段式布局。 +2. 搜索模块增加板块筛选:下拉选项为当次策略结果的板块聚合,选项旁展示数量,按数量倒序。 + +## 关键决策 + +- 板块口径:概念板块(sector_type=concept),与详情面板「板块」标签一致;接口保留 sector_type 参数可扩展行业。 +- 单选下拉;排序按 stock_count 倒序(后端保证),名称升序 tie-break。 +- 板块数据不在 selection 表中,按 ADR 0001 通过端口委托 sector_radar 读服务(不跨上下文 join SQL)。 + +## 实现 + +后端(zhixing-server): +- sector_radar:`domain/persistence.py` 新增 `SectorCountEntry` + 2 个协议方法;`infrastructure/postgres.py` / `infrastructure/memory.py` 实现 `load_sector_counts` / `load_sector_member_codes`;`application/read.py` 新增 `sector_counts` / `sector_member_codes`(先解析 last-good publication)。 +- selection:`domain/runs.py` 新增 `SelectionSectorReader` 端口、`SelectionSectorCount` / `SelectionSectorMembership` / `SelectionRunIdentity`,`SelectionResultQuery.sector`;`application/run.py` 新增 `list_sector_counts`,`get_run`/`get_latest` 经 identity → 成员代码 → `sector_stock_codes` 过滤;`infrastructure/postgres_runs.py` `_stock_filter` 支持 `ts_code = ANY(...)` / FALSE;`infrastructure/sector_membership.py` 桥接适配器;`presentation/http.py` 新增 `GET /sectors`,results/runs 增加 `sector` 参数。 + +前端(zhixing-web): +- `selection.types.ts` / `selection.api.ts` / `selection.query.ts`:`SelectionSectors`、`getSelectionResultSectors`、`useSelectionResultSectors`,query key 加 sector,结果失效同时失效 sectors。 +- `route-tree.tsx`:selection 路由 search 增加 `sector`。 +- `selection-results-page.tsx`:结果查询带 sector,页面调用 sectors hook 并下传 workbench;切策略重置 sector。 +- `selection-results-workbench.tsx`:布局重构为上搜索栏 + 下方 320px 列表/详情两栏;板块下拉(全部板块 + 聚合选项带数量徽标);聚合加载后自动清掉失效 sector。 + +## 测试 + +- 后端:`test_read.py` +8、`test_sector_filter.py` 新建 9 个、`test_selection_http.py` +5。 +- 前端:页面测试新增「filters by sector and shows per-sector counts」。 + +## 验收 + +- [x] 页面布局为上搜索栏 + 左列表右详情(移动端纵向堆叠 搜索→列表→详情) +- [x] 板块下拉选项为当次策略结果的概念板块聚合,选项旁展示数量,按数量倒序 +- [x] 选择板块后结果列表服务端过滤,`筛选结果 N 只` 反映叠加计数 +- [x] 后端 ruff/pyright/pytest 与前端 lint/typecheck/test/build 门禁通过(遗留项均为基线原有) + +## 遗留(均为基线原有,非本次引入) + +- 后端 pyright 16 个错误(chart.py/gold_brick.py pandas 相关、test_run.py 旧 fake 类型);前端 4 个执行状态抽屉测试失败;前端 format:check 有基线未格式化文件(.playwright-cli、sector-radar 部分文件、signal-detail-panel.tsx)。 diff --git a/.trellis/tasks/09-05-selection-layout-sector-filter/task.json b/.trellis/tasks/09-05-selection-layout-sector-filter/task.json new file mode 100644 index 0000000..f3132ba --- /dev/null +++ b/.trellis/tasks/09-05-selection-layout-sector-filter/task.json @@ -0,0 +1,26 @@ +{ + "id": "selection-layout-sector-filter", + "name": "selection-layout-sector-filter", + "title": "选股页面迭代:布局重构与板块筛选", + "description": "", + "status": "planning", + "dev_type": null, + "scope": null, + "package": null, + "priority": "P2", + "creator": "yuxuanhui", + "assignee": "yuxuanhui", + "createdAt": "2026-09-05", + "completedAt": null, + "branch": null, + "base_branch": "main", + "worktree_path": null, + "commit": null, + "pr_url": null, + "subtasks": [], + "children": [], + "parent": null, + "relatedFiles": [], + "notes": "", + "meta": {} +} \ No newline at end of file