# 美国市场数据集成任务清单

本文档用于跟踪和管理为项目集成美国市场数据（使用 Finnhub 作为数据源）所需的各项开发任务。

## 任务列表

- [x] **后端：实现 FinnhubProvider 数据映射**
  - **目标**：根据 `docs/financial_data_dictionary.md` 中的定义，在 `backend/app/data_providers/finnhub.py` 文件中，完成从 Finnhub API 原始数据到系统标准字段的完整映射。
  - **关键点**：
    - [x] 处理直接映射的字段。
    - [x] 实现所有需要通过计算得出的衍生指标。
    - [x] 确保处理 `null` 或空值，避免计算错误。
    - [x] 验证返回的数据结构符合 `DataManager` 的预期。

- [x] **后端：按市场分段的 API 路由**
  - **目标**：在 `backend/app/routers/financial.py` 中，将现有的 `/api/v1/financials/china/{ts_code}` 改为按市场分段：`/api/v1/financials/{market}/{stock_code}`（示例：`/api/v1/financials/us/AAPL`，`/api/v1/financials/cn/600519.SH`）。
  - **关键点**：
    - [x] 去除硬编码的 `china`，新增路径参数 `market`，并对取值做校验（`cn/us/hk/jp`）。
    - [x] 使用单一处理函数，根据 `market` 分派到相应的数据提供方与代码格式规范。

- [x] **前端：更新 API 调用**
  - **目标**：修改前端调用，基于用户选择的市场与股票代码，请求新的按市场分段路由。
  - **关键点**：
    - [x] 替换 `useChinaFinancials`，新增通用 `useFinancials(market, stockCode, years)`。
    - [x] 将请求路径改为 `/api/financials/{market}/{stock_code}?years=...`（代理到后端对应的 `/api/v1/financials/{market}/{stock_code}`）。
    - [ ] 确保展示与错误处理兼容美国、香港、日本等市场。

- [ ] **测试与验证**
  - **目标**：对整个流程进行端到端测试，确保两个市场的功能都稳定可靠。
  - **关键点**：
    - [ ] **中国市场回归测试**：使用多个中国 A 股代码测试，确保原有功能不受影响。
    - [ ] **美国市场功能测试**：使用多个美国股票代码（如 `AAPL`, `MSFT`）测试，验证报告能否成功生成。
    - [ ] **数据一致性验证**：抽样对比 Finnhub 返回的数据和前端展示的数据，确保映射和计算的准确性。
    - [ ] **错误处理测试**：测试无效的股票代码，检查系统是否能给出清晰的错误提示。

  - **前置条件**：
    - [ ] 在 `config/config.json` 或环境变量中配置 `FINNHUB_API_KEY`。
    - [ ] 后端已启动（默认 `http://127.0.0.1:8000/api`），前端已启动（默认 `http://127.0.0.1:3000`）。

  - **接口用例（后端）**：
    - [ ] GET `/api/v1/financials/cn/600519.SH?years=10`
      - 期望：`200`；返回 `ts_code`、`name`、`series`（含 `revenue`、`n_income` 等关键指标，period/年序列齐全）。
    - [ ] GET `/api/v1/financials/cn/000001.SZ?years=5`
      - 期望：`200`；返回与上同，近 5 年序列。
    - [ ] GET `/api/v1/financials/us/AAPL?years=10`
      - 期望：`200`；`series` 至少包含：`revenue`、`n_income`、`total_assets`、`total_hldr_eqy_exc_min_int`、`__free_cash_flow`、`grossprofit_margin`、`netprofit_margin`、`roe`、`roa`。
    - [ ] GET `/api/v1/financials/us/MSFT?years=10`
      - 期望：`200`；字段与口径同 AAPL。
    - [ ] GET `/api/v1/financials/us/INVALID?years=10`
      - 期望：`4xx/5xx`；`detail.message` 含可读错误。

  - **页面用例（前端）**：
    - [ ] 打开 `/report/600519.SH?market=cn`
      - 期望：基本信息与“昨日快照”显示；“财务数据（来自 Tushare）”表格展示 10 期内主要指标。
    - [ ] 打开 `/report/000001.SZ?market=cn`
      - 期望：与上同；代码规范化逻辑（无后缀时自动补 `.SZ/.SH`）正常。
    - [ ] 打开 `/report/AAPL?market=us`
      - 期望：“股价图表”正常；“财务数据”表格展示主要指标（含自由现金流、毛利率、净利率、ROA、ROE）。
    - [ ] 打开 `/report/MSFT?market=us`
      - 期望：与上同。
    - [ ] 打开 `/report/INVALID?market=us`
      - 期望：顶部状态为“读取失败”并有错误提示文案。

  - **验收标准**：
    - [ ] 中国市场功能无回归；美国市场关键指标齐全、值域合理（百分比类 ∈ [-1000%, 1000%]，金额类为有限数）。
    - [ ] 报错信息清晰可读；网络/密钥缺失时提示明确。
    - [ ] 页内主要表格不出现 `NaN/Infinity`；空值以 `-` 展示。
