From 3fc78ec9b1e9e2b9c5bf37960428512a1dc80241 Mon Sep 17 00:00:00 2001 From: yuxuanhui Date: Tue, 1 Sep 2026 13:38:45 +0800 Subject: [PATCH] chore(task): archive 09-01-stock-chart-display --- .../09-01-stock-chart-display/check.jsonl | 10 +++ .../09-01-stock-chart-display/design.md | 73 +++++++++++++++++++ .../09-01-stock-chart-display/implement.jsonl | 14 ++++ .../09-01-stock-chart-display/implement.md | 36 +++++++++ .../2026-09/09-01-stock-chart-display/prd.md | 37 ++++++++++ .../research/echarts.md | 36 +++++++++ .../research/repository-evidence.md | 22 ++++++ .../09-01-stock-chart-display/task.json | 26 +++++++ 8 files changed, 254 insertions(+) create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/check.jsonl create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/design.md create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.jsonl create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.md create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/prd.md create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/echarts.md create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/repository-evidence.md create mode 100644 .trellis/tasks/archive/2026-09/09-01-stock-chart-display/task.json diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/check.jsonl b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/check.jsonl new file mode 100644 index 0000000..ec28218 --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/check.jsonl @@ -0,0 +1,10 @@ +{"file":".trellis/spec/backend/selection.md","reason":"核验 qfq、目标日截断、KDJ 和 selection 语义"} +{"file":".trellis/spec/backend/http-api-contracts.md","reason":"核验新增 HTTP 响应与错误契约"} +{"file":".trellis/spec/backend/quality-guidelines.md","reason":"核验 Ruff、Pyright、pytest 和后端代码边界"} +{"file":".trellis/spec/frontend/component-guidelines.md","reason":"核验布局、状态、可访问性与组件边界"} +{"file":".trellis/spec/frontend/hook-guidelines.md","reason":"核验 React Query、AbortSignal 和同源请求"} +{"file":".trellis/spec/frontend/type-safety.md","reason":"核验前端 API 类型与 strict TypeScript"} +{"file":".trellis/spec/frontend/quality-guidelines.md","reason":"核验 Vitest 行为覆盖和完整前端门禁"} +{"file":".trellis/spec/guides/cross-layer-thinking-guide.md","reason":"核验跨层字段、状态和测试没有遗漏"} +{"file":".trellis/tasks/09-01-stock-chart-display/research/echarts.md","reason":"核验 ECharts 三轴缩放、按需模块和生命周期"} +{"file":".trellis/tasks/09-01-stock-chart-display/research/repository-evidence.md","reason":"核验图片映射、below-threshold 和详情接口缺口均已闭环"} diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/design.md b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/design.md new file mode 100644 index 0000000..c5ed359 --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/design.md @@ -0,0 +1,73 @@ +# 选股模块图表展示技术设计 + +## 1. 边界与总体方案 + +本任务继续使用现有 `selection` bounded context,不新建业务上下文。分页结果接口继续只承载列表与目标日摘要;新增独立只读详情接口按 `ts_code + target_trade_date` 返回最多 250 个升序 qfq 日线点及对应 KDJ,避免每页股票都携带大数组。 + +前端 selection feature 用独立 React Query 缓存详情图表。从现有 `md` 双栏断点起,工作台统一使用左 `1fr`、右 `3fr`,删除更大断点的旧比例覆盖;移动端沿用现有记录卡和展开交互,不在本次增加移动端复合图表。右侧详情依次展示股票摘要、复合图表、最佳案例 JPG、评分分解和信号指标。 + +## 2. 后端数据流与契约 + +新增 application 用例 `GetSelectionChart`,依赖已有 `MarketDataReader`。用例接收 `ts_code`、`target_trade_date` 和固定上限 250,读取目标日前完整 qfq 历史,在完整历史上复用 `compute_kdj` 计算递归 K/D/J,再把 OHLCV 与指标对齐并截取末尾最多 250 条。这样返回量受控,同时 KDJ 初值与策略计算保持一致。 + +新增接口: + +```text +GET /api/v1/selection/stocks/{ts_code}/chart?target_trade_date=YYYY-MM-DD +``` + +成功响应: + +```json +{ + "ts_code": "603259.SH", + "name": "药明康德", + "target_trade_date": "2026-08-31", + "source_adj": "qfq", + "points": [ + { + "trade_date": "2026-08-31", + "open": 1.0, + "high": 1.0, + "low": 1.0, + "close": 1.0, + "volume": 1.0, + "k": 50.0, + "d": 50.0, + "j": 50.0 + } + ] +} +``` + +OHLCV 或 KDJ 不可用的点用 `null` 保留日期对齐,不制造数值。前端遇到 OHLC 不完整的日期时保留 category 但不绘制该蜡烛,volume/K/D/J 也保持空点,KDJ 禁止跨空点连线。没有任何目标日前行情时返回 `404 chart_data_not_found`;数据库读取失败返回 `503 selection_storage_unavailable`。接口继续使用 FastAPI Pydantic response model 和同源 `/api/v1` 路径。 + +## 3. 最佳案例评分与图片 + +不改变十案例评分算法、阈值、排序或持久化。调整 HTTP 映射:只要评分状态是 `matched` 或 `below_threshold` 且内部结果完整,都返回实际 `value`、`threshold`、`version`、`case` 和 `breakdown`;状态仍保留原值,因此 UI 可以区分“达到阈值”和“最接近但低于阈值”。评分失败返回 `status="failed"` 且无 case;评分未执行沿用现有 `score: null` 契约,前端明确显示“本次运行未执行图形评分”,两者均不展示案例图。契约测试锁定 `null` 的既有语义,避免把字段遗漏误当成功结果。 + +把用户提供的十张 JPG 复制到 `zhixing-web/public/patterns/b1-cases/` 并保留原文件名。selection feature 维护穷举的 `case.id -> public URL` 映射;案例 ID 是稳定业务键,中文名只用于展示。若响应出现未知 case id,页面显示“案例图片暂不可用”,不猜测文件名。 + +## 4. 前端数据与组件 + +新增 `SelectionChart`、`SelectionChartPoint` 类型,API 函数通过 `requestJson` 调用详情接口并传递 `AbortSignal`,query key 包含股票代码和目标交易日。仅当存在选中股票时启用查询;切换股票时 React Query 取消或隔离旧请求,详情分别呈现加载、失败、空数据和成功状态。 + +新增 selection feature 内的复合图表组件,直接使用 `echarts/core`,按需注册 candlestick、bar、line、grid、tooltip、legend、dataZoom 和 Canvas renderer。三组 category x 轴共享相同交易日数组,candlestick、volume、K/D/J series 分别绑定三个 grid;inside 与 slider dataZoom 同时控制三组 x 轴。后端最多返回 250 点,前端通过 category `startValue`/`endValue` 精确选择末尾 120 点,不足 120 点时展示全部,并允许缩放查看返回的全部数据。 + +ECharts 初始化只发生在图表 DOM 挂载后;数据变化调用 `setOption`,容器变化通过 `ResizeObserver` 调用 `resize`,卸载时 `dispose`。option 构造与 API 数据转换保持为纯函数,避免在 jsdom 中依赖 Canvas 像素渲染。 + +最佳案例组件从 `score.case.id` 查找静态 JPG,使用语义标题、描述性 `alt`、固定 2:1 比例和 `loading="lazy"`。图像加载失败时保留案例名称和可读错误状态。 + +## 5. 兼容性与取舍 + +- 不把历史序列扩展到 `/selection/results`,避免分页和轮询响应膨胀。 +- 不新增图片数据库、上传接口或动态生成逻辑;案例库固定,因此静态资源映射是最小充分方案。 +- 不引入 React ECharts wrapper,减少 React 19 兼容面;只增加 `echarts` 一个运行时依赖。 +- 移动端暂不加载大图表,维持现有详情展开行为;桌面端按需求提供完整详情。 +- 不新增迁移。最佳案例字段已经持久化,图表读取复用现有 market data。 + +## 6. 风险、回滚与验证重点 + +主要风险是 KDJ 窗口被错误截断、股票切换显示上一只股票的数据、ECharts 容器未 resize/dispose、缺失行情点错误连线、未知案例 ID 产生错误图片,以及低于阈值的最佳案例仍被 HTTP 丢弃。测试分别锁定完整历史计算后截断、query key、加载/错误/空状态、三轴同步 option、缺失点处理、静态映射完整性和 below-threshold 契约。案例图片行为测试必须断言详情中恰有一张 ``,其 `src` 由返回的 `case.id` 映射,案例名称和评分与同一响应一致;低于阈值也执行同一断言。 + +回滚可以按层撤销:删除新增详情接口与用例、恢复评分 HTTP 映射、移除 ECharts 组件/依赖和静态 JPG,再恢复原 grid class;没有数据库迁移或不可逆数据写入。 diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.jsonl b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.jsonl new file mode 100644 index 0000000..1eb2230 --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.jsonl @@ -0,0 +1,14 @@ +{"file":".trellis/spec/backend/index.md","reason":"后端 selection bounded context、HTTP 契约与质量入口"} +{"file":".trellis/spec/backend/selection.md","reason":"qfq 历史读取、目标日边界、KDJ 与选股结果契约"} +{"file":".trellis/spec/backend/http-api-contracts.md","reason":"新增详情接口的 Pydantic、路由和同源 API 约束"} +{"file":".trellis/spec/backend/error-handling.md","reason":"图表空数据与存储失败的错误映射"} +{"file":".trellis/spec/backend/quality-guidelines.md","reason":"Python 类型、文档字符串与测试门禁"} +{"file":".trellis/spec/frontend/index.md","reason":"React feature 分层和质量入口"} +{"file":".trellis/spec/frontend/component-guidelines.md","reason":"详情组件、Tailwind、页面状态与可访问性"} +{"file":".trellis/spec/frontend/hook-guidelines.md","reason":"requestJson、AbortSignal、React Query key 与状态归属"} +{"file":".trellis/spec/frontend/type-safety.md","reason":"跨层响应类型与 strict TypeScript 约束"} +{"file":".trellis/spec/frontend/quality-guidelines.md","reason":"Vitest 行为测试和前端质量门禁"} +{"file":".trellis/spec/guides/code-reuse-thinking-guide.md","reason":"复用 reader、requestJson、query key 和 UI primitive"} +{"file":".trellis/spec/guides/cross-layer-thinking-guide.md","reason":"后端响应到前端 query/页面的完整契约链"} +{"file":".trellis/tasks/09-01-stock-chart-display/research/echarts.md","reason":"ECharts 复合金融图、dataZoom 和生命周期方案"} +{"file":".trellis/tasks/09-01-stock-chart-display/research/repository-evidence.md","reason":"现有数据能力、最佳案例图片和契约缺口"} diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.md b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.md new file mode 100644 index 0000000..b8ecd9d --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/implement.md @@ -0,0 +1,36 @@ +# 选股模块图表展示实施计划 + +## 1. 后端图表详情用例与契约 + +- [x] 在 selection application 层新增 `GetSelectionChart` 及具名返回模型,复用 `MarketDataReader.load_history` 和 `compute_kdj`,在完整目标日前历史上计算后截取末尾最多 250 点。 +- [x] 为用例补充单元测试,覆盖升序输出、目标日截断、超过 250 点、KDJ 对齐、空历史和可空值。 +- [x] 在 selection HTTP 层新增 `GET /stocks/{ts_code}/chart` 的 Pydantic response model、依赖组合和错误映射。 +- [x] 扩展 HTTP 测试,覆盖成功、404 空行情、503 存储错误、日期参数校验和完整响应字段。 + +## 2. 最佳案例契约与静态资源 + +- [x] 调整 `_pattern_score_response`,让 `below_threshold` 与 `matched` 一样返回真实 value/case/breakdown,同时保留状态与阈值语义;补充后端 HTTP 测试。 +- [x] 将用户提供目录中的十张 JPG 复制到 `zhixing-web/public/patterns/b1-cases/`,保留文件名,并核对十个 case id 均有且仅有一个资源。 +- [x] 在 selection feature 中新增穷举案例图片映射和展示组件;测试断言匹配和低于阈值时详情恰有一张 ``,其 `src`、案例名称和分数来自同一个 `case.id`,并覆盖未知案例、图片加载失败、`score: null` 未评分和评分失败状态。 + +## 3. 前端详情数据链路 + +- [x] 在 `selection.types.ts` 定义图表响应类型,在 `selection.api.ts` 增加同源详情请求,在 `selection.query.ts` 增加包含股票代码和目标日的 query key/hook,并传递 `AbortSignal`。 +- [x] 为 API URL 编码、查询参数和 query 启用条件补充窄测试。 +- [x] 在工作台/详情组件中接入图表 query,保证选择切换不会显示旧股票数据,并呈现加载、错误、空数据和成功状态。 + +## 4. ECharts 复合图表与布局 + +- [x] 用 pnpm 添加 `echarts` 运行时依赖并更新 lockfile,不引入 React wrapper。 +- [x] 新增 option 纯构造函数和图表组件;按需注册 candlestick、bar、line、grid、tooltip、legend、dataZoom、Canvas renderer,绑定三组 grid/axis/series。 +- [x] 实现最多 250 点、用 category `startValue`/`endValue` 精确显示最后 120 点(不足时全量)的 inside + slider 同步缩放,以及 ResizeObserver resize 和卸载 dispose。 +- [x] 用纯函数测试锁定 `[open, close, low, high]` 顺序、volume/KDJ 对齐、缺失 OHLC 不绘制蜡烛、空 KDJ 不跨点连线、三个 xAxis 索引和精确 120 点初始范围;页面行为测试断言可见状态与可访问名称。 +- [x] 从 `md` 双栏断点起将 grid 统一改为左 `1fr`、右 `3fr`,移除 `lg` 的旧比例覆盖并保持移动端现有记录卡行为;在图表正下方展示最佳案例 JPG,再展示评分分解和关键指标。 + +## 5. 验证与回滚点 + +- [x] 运行后端窄测试:`uv run --directory zhixing-server pytest tests/unit/selection tests/test_selection_http.py -q`。 +- [x] 运行前端窄测试:`pnpm --dir zhixing-web test -- selection`,并运行 `pnpm --dir zhixing-web typecheck`。 +- [x] 运行完整质量门禁:`./dev.sh check`、`./dev.sh test`,再运行 `pnpm --dir zhixing-web build` 验证产物。 +- [x] 使用本地页面核对 1:3 布局、药明康德/方正科技案例图、股票切换、缩放同步和详情滚动;当前数据库未用于验收,已使用确定性 Mock API 与真实浏览器核对。 +- [x] 回滚前先确认无数据库迁移;按“HTTP/用例、前端 query/组件、静态资产与依赖、grid class”顺序撤销即可恢复旧行为。 diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/prd.md b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/prd.md new file mode 100644 index 0000000..f85321d --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/prd.md @@ -0,0 +1,37 @@ +# 选股模块图表展示迭代 + +## Goal + +提升选股模块详情页的信息密度和技术分析能力,使用户可以在查看选股结果时直接核对股票的日线走势、成交量、KDJ 指标,并查看该股票最高相似度案例对应的参考图。 + +## Background + +当前需求由用户明确提出,包含列表与详情页布局调整、详情页技术图表扩展,以及最佳匹配案例图片展示。当前桌面工作台实际是左宽右窄的两列布局,详情响应只有目标交易日标量,不包含历史序列。PostgreSQL 已保存按交易日升序的 qfq 日线 OHLCV,selection 领域已有 KDJ 计算,因此完整技术图表的数据基础已经具备,但需要新增只读详情契约。 + +仓库另有固定的十个图形匹配案例,评分器会把选中股票逐一与十个案例比较并保留最高分案例。对应的十张 `2800x1400` JPG 位于 `/Users/yuxuanhui/bcc-github/quant-project/zgnb/zgnb-project/docs/references/patterns/b1-cases`,文件中的 `case_001`、`case_002`、`case_003`、`case_004`、`case_006` 至 `case_011` 与当前代码案例定义一一对应。用户已明确:每只股票只展示最高相似度案例对应的一张 JPG;例如药明康德最高匹配方正科技时,展示方正科技 JPG。 + +## Requirements + +- 选股模块从现有 `md` 桌面双栏断点起,左侧列表与右侧详情区域的宽度比例调整为 `1:3`,更小视口保持现有移动布局。 +- 右侧详情区域增加一张完整技术图表,至少包含日线 K 线、成交量和 KDJ 三部分。 +- 技术图表下方展示当前股票最高相似度案例对应的一张 JPG,并同时保留可读的案例名称和评分信息。 +- 每个已完成评分的股票都应返回最高相似度分数和最佳案例,即使该分数低于业务匹配阈值;评分失败或未执行时不伪造案例图片。 +- 可以引入与现有前端技术栈兼容的第三方图表库,但应控制新增依赖和改动范围。 +- 图表行情必须使用目标交易日及之前的 qfq 日线,不能读取目标日之后的数据。 +- 详情接口最多返回目标交易日前 250 个交易日;图表默认聚焦最近 120 个交易日,并允许用户缩放查看接口返回的全部数据。 + +## Acceptance Criteria + +- [x] 从 `md` 双栏断点起,左侧列表和右侧详情区域呈现 `1:3` 的可用宽度比例,且不存在更大断点覆盖回旧比例。 +- [x] 选中一只股票后,右侧能够展示与该股票对应的日线 K 线、成交量和 KDJ 指标,三部分时间轴或数据窗口保持一致。 +- [x] 图表数据不超过目标交易日前 250 个交易日,首屏聚焦最近 120 个交易日;缩放操作同步作用于日线、成交量和 KDJ 三个区域。 +- [x] 图表下方只展示当前股票最高相似度案例对应的一张 JPG;图片、案例名称和评分属于同一个最佳案例,药明康德匹配方正科技的场景会展示方正科技 JPG。 +- [x] 低于阈值但评分成功的股票仍展示实际最高分、最佳案例及对应 JPG;未执行或失败时展示明确状态且不显示错误图片。 +- [x] 页面在加载、空数据和接口失败时不会崩溃,并给出符合现有页面风格的状态反馈。 +- [x] 相关前后端静态检查和自动化测试通过,且没有破坏现有选股列表与详情交互。 + +## Out of Scope + +- 暂不改变选股算法、图形相似度评分规则或股票筛选逻辑。 +- 暂不增加用户自定义技术指标、画线工具或交易下单能力。 +- 暂不动态生成案例图片,也不展示最佳案例之外的其他九张 JPG。 diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/echarts.md b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/echarts.md new file mode 100644 index 0000000..f1fbed1 --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/echarts.md @@ -0,0 +1,36 @@ +# Apache ECharts 复合行情图研究 + +## 结论 + +本任务使用 `echarts` 本体并通过 `echarts/core` 按需注册,不引入 React 包装库。一个 ECharts 实例通过三个 `grid`、三组 category `xAxis`/value `yAxis`,以及分别绑定索引的 candlestick、bar、line series 组合日线、成交量和 KDJ。`inside` 与 `slider` 两个 `dataZoom` 同时控制三个 x 轴,使三个区域保持同一数据窗口。 + +前端组件在 DOM 挂载后调用 `echarts.init` 和 `setOption`,容器尺寸变化时调用 `resize`,卸载时调用 `dispose`。配置与数据转换应提取为纯函数,便于在 Vitest/jsdom 中验证 series、axis、数据顺序和初始缩放,而不依赖 Canvas 像素结果。 + +## 所需模块 + +- charts:`CandlestickChart`、`BarChart`、`LineChart` +- components:`GridComponent`、`TooltipComponent`、`LegendComponent`、`DataZoomComponent` +- renderer:`CanvasRenderer` +- 类型:使用 ECharts 提供的 `ComposeOption` 组合已注册组件的 option 类型 + +## 数据约定 + +- K 线数据顺序为 `[open, close, low, high]`。 +- 日线、成交量、K、D、J 共用升序交易日 category 数据。 +- 后端最多返回 250 点;前端用 category 的 `startValue` 和 `endValue` 精确选择最后 120 个点,不足 120 点时展示全部。 +- 三组 series 通过 `xAxisIndex`/`yAxisIndex` 绑定各自 grid;两个 dataZoom 的 `xAxisIndex` 同时包含 `[0, 1, 2]`。 +- OHLC 不完整的日期使用 ECharts 缺失数据占位,不绘制蜡烛;volume/K/D/J 的空值保持空点,KDJ series 设置 `connectNulls: false`,禁止跨缺失日期连线。 + +## 资料来源 + +2026-09-01 通过 Context7 查询官方 Apache ECharts 文档 `/apache/echarts-doc`。相关官方资料包括: + +- `en/tutorial/data-zoom.md`:slider 与 inside dataZoom 组合,以及用 axis index 控制指定轴。 +- `en/option/component/data-zoom.md`:一个 dataZoom 同时控制多个轴。 +- `slides/arch-brief/asset/ec-demo/list-sample1.html`:candlestick、volume、多 grid、多 xAxis/yAxis 和 dataZoom 的金融图表示例。 +- `en/tutorial/basic-concepts-overview.md`:`echarts.init`、option、多个 axis/series 与 `setOption` 的基本实例生命周期。 +- `zh/tutorial/whats-new-in-echarts-v5.md`:按需引入时通过 `ComposeOption` 获得严格 TypeScript 类型。 + +## 本仓库约束 + +前端为 React 19、TypeScript strict、Vite 8;服务器状态应通过 TanStack Query 获取,API 走同源 `/api/v1`。图表属于 `selection` feature,不提升为 shared primitive。 diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/repository-evidence.md b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/repository-evidence.md new file mode 100644 index 0000000..10be5ce --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/research/repository-evidence.md @@ -0,0 +1,22 @@ +# 选股详情图表仓库证据 + +## 当前页面与契约 + +- `zhixing-web/src/features/selection/components/selection-results-workbench.tsx` 当前桌面布局左宽右窄,目标应改为左 `1fr`、右 `3fr`。 +- `zhixing-web/src/features/selection/components/signal-detail-panel.tsx` 当前只展示目标日价格、信号、评分和指标,没有历史图表或案例图片。 +- `zhixing-web/src/features/selection/api/selection.types.ts` 与后端 `SelectionStockResponse` 只有目标日标量,没有历史 OHLCV/KDJ 序列。 +- 现有前端依赖没有图表库。 + +## 行情与指标能力 + +- `PostgresMarketDataReader.load_history` 已按 `source_adj = 'qfq'`、`trade_date <= target_trade_date` 升序读取 OHLCV。 +- `StockHistory`/`SelectionBar` 已描述存储无关的升序日线。 +- `compute_kdj` 已实现与策略一致的 K、D、J 计算。本任务应在完整目标日前历史上计算后再截取末尾最多 250 点,避免只用返回窗口重新初始化 KDJ 状态。 +- 现有 selection HTTP 只有 runs/results;复合图表需要独立的股票详情只读接口,避免把大序列塞进分页列表响应。 + +## 最佳案例图片 + +- 当前 `ZHIXING_B1_PATTERN_CASES` 是 `case_001`、`case_002`、`case_003`、`case_004`、`case_006` 至 `case_011` 共十个案例。 +- 用户提供目录 `/Users/yuxuanhui/bcc-github/quant-project/zgnb/zgnb-project/docs/references/patterns/b1-cases` 含对应的十张 `2800x1400` JPG;文件名中的 case id、股票代码、名称与日期与当前代码定义一一对应。 +- 评分结果已持久化最高案例。HTTP 对 `matched` 返回 `case.id/name/breakout_date`,但 `below_threshold` 当前丢弃实际 value/case/breakdown;本任务需要让所有成功评分状态保留这些真实结果。 +- 图片作为本前端固定静态资产按 `case.id` 映射,不需要数据库表、图片上传或后端文件服务。 diff --git a/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/task.json b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/task.json new file mode 100644 index 0000000..ad23a6f --- /dev/null +++ b/.trellis/tasks/archive/2026-09/09-01-stock-chart-display/task.json @@ -0,0 +1,26 @@ +{ + "id": "stock-chart-display", + "name": "stock-chart-display", + "title": "选股模块图表展示迭代", + "description": "", + "status": "completed", + "dev_type": null, + "scope": null, + "package": null, + "priority": "P2", + "creator": "yuxuanhui", + "assignee": "yuxuanhui", + "createdAt": "2026-09-01", + "completedAt": "2026-09-01", + "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