新增公司资料/指数/重大事项等 13 个接口, 文档全面对齐
- 新增 fin_mda/fin_equity/fin_company/fin_belong_index/fin_major_events 5 个模块 - 覆盖: 管理层讨论、股本结构、公司介绍、所属行业、指数分类/统计/成分、并购/股权激励/诉讼/关联交易/违规/担保 - _emchoice.fetch_report 支持"数据为空"按空结果处理 - api.py 增加 _simple_endpoint 统一生成纯 stocks 参数接口, 路由达 29 个 /fin 端点 - 冒烟测试扩展至 56 用例, 全部通过 - api_manual/blueprint/SKILLS/待优化 文档与代码路径 100% 对齐
This commit is contained in:
+37
-6
@@ -39,6 +39,11 @@ EMWebApi/
|
||||
│ ├── fin_free_holders.py # 十大流通股东
|
||||
│ ├── fin_holders.py # 十大股东明细
|
||||
│ ├── fin_holder_num.py # 股东户数
|
||||
│ ├── fin_mda.py # 管理层讨论与分析(MD&A)
|
||||
│ ├── fin_equity.py # 股本结构
|
||||
│ ├── fin_company.py # 公司介绍 + 所属行业
|
||||
│ ├── fin_belong_index.py # 所属指数分类/统计/成分权重
|
||||
│ └── fin_major_events.py # 重大事项(并购/激励/诉讼/关联/违规/担保)
|
||||
├── tests/
|
||||
│ └── test_interfaces.py # 冒烟测试 (连真实接口)
|
||||
└── docs/
|
||||
@@ -49,7 +54,8 @@ EMWebApi/
|
||||
|
||||
**依赖方向**:
|
||||
- `fin_quarterly.py` / `fin_main_business.py` 复用 `fin_summary.py` 里的 `HEADERS` / `TIMEOUT` / `BASE_URL`(顺带触发其模块级的 SSL 自动修复)
|
||||
- 其余 9 个新模块复用 `_emchoice.py` 的 `get_data_url` / `fetch_report`(同样会触发 SSL 修复)
|
||||
- 其余新模块复用 `_emchoice.py` 的 `get_data_url` / `fetch_report`(同样会触发 SSL 修复)
|
||||
- `fin_major_events.py` / `fin_company.py` / `fin_belong_index.py` 内部有 `_run` / `_fetch_one` 复用,避免六接口重复样板
|
||||
|
||||
---
|
||||
|
||||
@@ -71,6 +77,19 @@ EMWebApi/
|
||||
| 12 | 十大流通股东 | `RPT_F10_EH_FREEHOLDERS` | ✅ 已实现 |
|
||||
| 13 | 十大股东明细 | `RPT_DMSK_HOLDERS` | ✅ 已实现 |
|
||||
| 14 | 股东户数 | `RPT_F10_EH_HOLDERNUM` | ✅ 已实现 |
|
||||
| 15 | 管理层讨论与分析 | `RPT_BUSINESSANALYSIS` | ✅ 已实现 |
|
||||
| 16 | 股本结构 | `RPT_F10_EH_EQUITY` | ✅ 已实现 |
|
||||
| 17 | 公司介绍 | `RPT_HSF9_BASIC_ORGINFO` | ✅ 已实现 |
|
||||
| 18 | 所属行业 | `RPT_STOCKF9_INDUSTRY` | ✅ 已实现 |
|
||||
| 19 | 指数分类 | `RPT_HSF9_BELONGINDEX_CLASSIF` | ✅ 已实现 |
|
||||
| 20 | 纳入指数统计 | `RPT_CUSTOM_HSF9_BELONG_INDEX` | ✅ 已实现 |
|
||||
| 21 | 指数成分权重 | `RPT_HSF9_BELONG_INDEX` | ✅ 已实现 |
|
||||
| 22 | 并购事件 | `RPT_HS_ACQUISITIONS_EVENT` | ✅ 已实现 |
|
||||
| 23 | 股权激励 | `RPT_DMSK_SH_EQUITYINCENTIVE` | ✅ 已实现 |
|
||||
| 24 | 诉讼仲裁 | `RPT_LITIGATION_ARBITRATION_BSINFO` | ✅ 已实现 |
|
||||
| 25 | 关联交易 | `RPT_RELATED_TRANSACTION` | ✅ 已实现 |
|
||||
| 26 | 违规处罚 | `RPT_HSF9_OP_VIOLATION` | ✅ 已实现 |
|
||||
| 27 | 对外担保 | `RPT_F9_GUARANTEE` | ✅ 已实现 |
|
||||
|
||||
**文档外补充**:财务摘要(报告期) 用 `RPT_CUSTOM_ORGF9_FIN_SUMMARY`,需 ORG_CODE(不在 api_docs.md 里)。
|
||||
|
||||
@@ -78,10 +97,11 @@ EMWebApi/
|
||||
|
||||
## 4. 实施进度
|
||||
|
||||
### ✅ 已完成(11 类接口全部落地)
|
||||
### ✅ 已完成(api_docs.md 全部 27 项落地)
|
||||
|
||||
| 功能 | 核心文件 | HTTP 接口 |
|
||||
|------|----------|-----------|
|
||||
| 健康检查 | `api.py` | `GET /health` |
|
||||
| 财务摘要(报告期) | `utils/fin_summary.py` | `GET /fin/summary` |
|
||||
| 财务摘要(单季度) | `utils/fin_quarterly.py` | `GET /fin/quarterly-summary` |
|
||||
| 主营构成(产品/地区) | `utils/fin_main_business.py` | `GET /fin/main-business` |
|
||||
@@ -93,11 +113,22 @@ EMWebApi/
|
||||
| 营运能力 | `utils/fin_operate.py` | `GET /fin/operate-ability` |
|
||||
| 成长能力 | `utils/fin_growth.py` | `GET /fin/growth` |
|
||||
| 杜邦分析 | `utils/fin_dupont.py` | `GET /fin/dupont` |
|
||||
| 分红明细 + 统计 | `utils/fin_dividend.py` | `GET /fin/dividend-detail` / `dividend-statics` |
|
||||
| 分红明细 + 统计 | `utils/fin_dividend.py` | `GET /fin/dividend-detail` / `GET /fin/dividend-statics` |
|
||||
| 十大流通股东 | `utils/fin_free_holders.py` | `GET /fin/free-holders` |
|
||||
| 十大股东明细 | `utils/fin_holders.py` | `GET /fin/holders` |
|
||||
| 股东户数 | `utils/fin_holder_num.py` | `GET /fin/holder-num` |
|
||||
| 测试 | `tests/test_interfaces.py` | `uv run pytest tests/ -q` (30 用例) |
|
||||
| 管理层讨论与分析 | `utils/fin_mda.py` | `GET /fin/mda` |
|
||||
| 股本结构 | `utils/fin_equity.py` | `GET /fin/equity` |
|
||||
| 公司介绍 | `utils/fin_company.py` | `GET /fin/company-info` |
|
||||
| 所属行业 | `utils/fin_company.py` | `GET /fin/industry` |
|
||||
| 指数分类/统计/成分 | `utils/fin_belong_index.py` | `GET /fin/index-classif` / `GET /fin/belong-index` / `GET /fin/index-membership` |
|
||||
| 并购事件 | `utils/fin_major_events.py` | `GET /fin/acquisitions` |
|
||||
| 股权激励 | `utils/fin_major_events.py` | `GET /fin/equity-incentive` |
|
||||
| 诉讼仲裁 | `utils/fin_major_events.py` | `GET /fin/litigation` |
|
||||
| 关联交易 | `utils/fin_major_events.py` | `GET /fin/related-transaction` |
|
||||
| 违规处罚 | `utils/fin_major_events.py` | `GET /fin/violation` |
|
||||
| 对外担保 | `utils/fin_major_events.py` | `GET /fin/guarantee` |
|
||||
| 测试 | `tests/test_interfaces.py` | `uv run pytest tests/ -q` (56 用例) |
|
||||
|
||||
### 🧹 待清理
|
||||
|
||||
@@ -112,8 +143,8 @@ EMWebApi/
|
||||
2. **结构**:`_build_*(参数构造)` → `_fetch_one(单只拉取)` → `get_<主题>(批量主入口)`
|
||||
3. **共享**:`from utils.fin_summary import HEADERS, TIMEOUT`,不重复定义;不同 base_url 的接口在本文件内定义新常量;emws 跳转接口用 `_emchoice.get_data_url`,datacenter 报表用 `_emchoice.fetch_report`
|
||||
4. **数据流**:内部统一 `pandas.DataFrame`,每行冗余 `SECUCODE` 列便于多股票合并
|
||||
5. **校验**:`payload.get("success")` 失败抛 `RuntimeError`;空数据返回空 DataFrame 而非报错
|
||||
6. **接口暴露**:api.py 中新增 `GET /fin/<主题>`,参数用 FastAPI `Query`,返回 `{success, count, columns, data, errors}` 风格,NaN/NaT/inf 转 None(复用 `_df_to_json_payload`),无数据统一走 `_empty_response`
|
||||
5. **校验**:`fetch_report` 中 `success=False` 且 message 为"返回数据为空/暂无数据/无数据"时按空结果处理(返回空列表),其余失败抛 `RuntimeError`;空数据返回空 DataFrame 而非报错
|
||||
6. **接口暴露**:api.py 中新增 `GET /fin/<主题>`,参数用 FastAPI `Query`,返回 `{success, count, columns, data, errors}` 风格,NaN/NaT/inf 转 None(复用 `_df_to_json_payload`),无数据统一走 `_empty_response`;仅 `stocks`(+`years`) 参数的接口可用 `_simple_endpoint` 统一生成
|
||||
7. **礼貌抓取**:批量循环中加随机延时(参考 `SLEEP_RANGE`)
|
||||
8. **注释语言**:中文,解释"为什么"(如接口编码映射差异)
|
||||
9. **测试**:新模块在 `tests/test_interfaces.py` 注册冒烟用例(连真实接口取 1 年数据,断言非空 + 关键列)
|
||||
|
||||
Reference in New Issue
Block a user