From be1afd248e4cc9b03a1e21090602a945af6988b2 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Mon, 21 Sep 2026 01:40:10 +0800 Subject: feat(app): 接入 AKShare 行情采集、净值查询与前端净值曲线 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [变更性质] - 本提交完成 3b 行情闭环:真实 AKShare 搜索与净值采集、PostgreSQL 持久化、鉴权 API 与 Fable 前端净值曲线展示。 [新增功能] - API 新增 /api/instruments/search、/api/instruments/{code}/nav 与 nav/refresh 接口,经 Bearer 鉴权调用 AKShare Python 采集器并幂等落库。 - 前端提供基金搜索、精确代码选择、历史净值刷新/重读与 SVG 折线图,token 变更即清空私有结果并失效在途请求。 [实现方案] - MarketData 以 requiredProperty 校验采集器 payload,净值观测按 (code, nav_date) 幂等 upsert 并保留来源与哈希。 - 前端以 requestId 序列守卫 SearchCompleted/SearchFailed/NavCompleted/NavFailed,TokenChanged 同时递增 searchSeq/navSeq 拒绝过期响应;边界解码兼容 F# option 的 {"case":"Some"} 线格式。 [影响范围] - 新增 FundLab.Web.Tests(边界解码、序列失效、图表纯函数共 8 项),扩展 API 测试至 20 项;vite dev 代理 /api 至本地 API。 - 真实 AKShare 端到端依赖本机 akshare 环境,由负责人另行验收;本提交不包含 docs/overnight-progress.md 的现有修改。 --- tests/FundLab.Web.Tests/ChartTests.fs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 tests/FundLab.Web.Tests/ChartTests.fs (limited to 'tests/FundLab.Web.Tests/ChartTests.fs') diff --git a/tests/FundLab.Web.Tests/ChartTests.fs b/tests/FundLab.Web.Tests/ChartTests.fs new file mode 100644 index 0000000..cede2d2 --- /dev/null +++ b/tests/FundLab.Web.Tests/ChartTests.fs @@ -0,0 +1,23 @@ +namespace FundLab.Web.Tests + +open Xunit +open FundLab.Web + +module ChartTests = + + [] + let ``chart points preserve chronological order and normalize NAV values`` () = + let observations : NavObservation list = + [ + { navDate = "2026-01-01"; nav = "1.00000000"; dailyReturn = None } + { navDate = "2026-01-02"; nav = "1.25000000"; dailyReturn = Some "25.00000000" } + { navDate = "2026-01-03"; nav = "1.10000000"; dailyReturn = Some "-12.00000000" } + ] + + let points = Chart.chartPoints observations + + Assert.Equal(3, points.Length) + Assert.Equal(0.0, points[0].x) + Assert.Equal(1.0, points[1].y) + Assert.Equal(0.4, points[2].y) + Assert.Equal("2026-01-03", points[2].navDate) -- cgit v1.2.3