## 调研结论(可行性:具备) **现状** - 详情面板 `zhixing-web/src/features/selection/components/signal-detail-panel.tsx` 只展示名称/代码/价格/指标,无行业板块;`SelectionStockResult` 类型也无相关字段。 - 后端 `market_stock` 表没同步 tushare `stock_basic.industry`;但项目已有 **sector_radar 模块**,通过 tushare `dc_index`/`dc_member` 每日同步"行业板块 + 概念板块"的成分股快照到 PostgreSQL 表 `sector_radar_membership`(trade_date + sector_type=industry/concept + sector_code/name + stock_code),只是目前只暴露了板块级 rankings 端点,**没有"按股票反查所属板块"的接口**——这就是缺口的全部。 - 已确认决策:数据口径复用 sector_radar(DC 行业+概念);仅详情面板展示,列表行不动。 ## 实施方案 ### 第 0 步:数据验证(前置) 启动 docker compose 的 PostgreSQL,检查 `sector_radar_membership` 按交易日的覆盖情况。若选股目标日期无快照,运行现有 CLI `sector-radar-build` 回补。若 dc_member 接口因 tushare 积分不足失败,回退方案是给 `market_stock` 加 `stock_basic.industry` 列(Alembic 迁移),届时向你说明。 ### 后端(sector_radar 模块内新增"按股票反查",不跨模块读表) 1. `modules/sector_radar/infrastructure/postgres.py`:新增读查询——按 `stock_code` 查 `membership_status='available'` 且 `trade_date <= 目标日` 的最近可用快照(带出实际 membership 的 trade_date,point-in-time 语义,不用最新日期冒充历史)。 2. `modules/sector_radar/application/read.py`:新增用例,输入 `ts_code + trade_date`,返回按类型分组的板块列表(industry 全部、concept 排序后默认截断 20 个)。 3. `modules/sector_radar/presentation/http.py`:新增端点 `GET /api/v1/sector-radar/stocks/{ts_code}/membership?trade_date=YYYY-MM-DD&limit=20` 响应:`{ ts_code, trade_date, membership_trade_date, industries: [{code,name}], concepts: [{code,name}], concept_total }`,遵循 http-api-contracts spec(Pydantic 边界模型)。 ### 前端(selection feature) 4. 新增 API 调用 + TanStack Query hook(`enabled: !!stock`,按 `stock.target_trade_date` 查询,随详情面板选中切换)。 5. `signal-detail-panel.tsx`:股票名/代码/价格下方新增两行展示—— - **行业**:行业标签(通常 1 个) - **所属板块**:概念板块 chips,最多显示 8 个 + "等 N 个" 加载中显示占位文案,无数据时静默隐藏(不打扰无板块数据的股票)。 ### 测试与验证 - 后端:读用例单测(命中/无快照/截断)+ http 端点测试,参照 sector_radar 现有测试。 - 前端:vitest 组件测试 + typecheck/lint。 - 端到端:起 server + web,在 `/selection` 选一只股票确认行业与板块正确显示、无数据股票正常降级。 ### 涉及文件 - `zhixing-server/.../modules/sector_radar/{application/read.py, infrastructure/postgres.py, presentation/http.py}` - `zhixing-web/src/features/selection/api/*`(新 query) - `zhixing-web/src/features/selection/components/signal-detail-panel.tsx`