# 切片 03：情绪周期、五类股池与涨停表现

> 基线：`a426432`（切片 02）
> 回档标签：`xiaobai-preservation-slice-03-20260731`
> 结论：源码、API、数据库、真实页面和浏览器回归通过；最终视觉仍等待全站人工验收

## 1. 原实现归位

本切片只移动原版副本中的真实实现，没有从 `next/` 取用代码，也没有改写情绪公式、股池数据、
原因补全、表格、样式或交互。

| 原位置 | 新的唯一实现位置 | 原位置兼容 |
|---|---|---|
| `app/backend/application.py` 的 2 个情绪服务方法 | `app/backend/features/sentiment/service.py` | `DashboardService` 继承 `SentimentServiceMixin` |
| `app/backend/application.py` 的 6 个股池原因及事件补全方法 | `app/backend/features/pools/service.py` | `DashboardService` 继承 `PoolServiceMixin` |
| `app/database.py` 的 2 个原因覆盖方法 | `app/backend/features/pools/repository.py` | `ReviewDatabase` 继承 `PoolRepositoryMixin` |
| `app/sentiment_engine.py` | `app/backend/features/sentiment/engine.py` | 根模块为同一模块对象的兼容别名 |

五类股池、涨停梯队和涨停表现仍由切片 02 已归位的原 Tushare 总览实现生成，本切片没有建立第二套
计算或数据来源。

## 2. 等价证据

- `test_preservation_slice_sentiment_pools.py` 对 8 个业务方法和 2 个 Repository 方法逐项执行无位置
  信息 AST 比较，全部与根目录原版 `server.py`、`database.py` 完全相同。
- 新的情绪引擎文件与原版 `sentiment_engine.py` SHA-256 完全相同；根级兼容模块与新模块是同一模块对象。
- 已归位的应用、行情服务、Tushare Provider、演示数据和选股模块直接导入新的唯一实现；Tushare
  Provider 仅调整该导入，其全部类和函数 AST 继续与原版一致。
- 原版 `8784` 与迁移版 `8785` 在相同账号、日期和数据库副本上请求 `/api/dashboard` 与
  `/api/sentiment/history`，JSON 状态、字段、值和顺序完全相同。
- 2026-07-30 的同请求结果均为：涨停 56、炸板 23、跌停 83、昨日涨停 81、情绪历史 20 日。
- 原版和迁移版数据库均为 62 个 schema 对象，schema 哈希均为
  `17918327f8b919496e6630458293f9f777c7c24662625bb3fc0b64ff0a8fbeef`。
- `config/api.config.json`、API 路径、鉴权和 `app/static/` 未修改。
- `app-light-1920x1080.png` 是真实迁移服务载入完成后的情绪周期页面，SHA-256 为
  `e387417abbe0667e00875a8d4061b5546748ecf2452a692d06d078d516330dab`。

## 3. 真实运行检查

- 迁移副本：`http://127.0.0.1:8785/`，管理员会话与缓存行情载入正常。
- 情绪周期：20 个连续交易日、当前阶段、评分构成和交易日明细均完整显示。
- 股池：涨停池 56 行、炸板池 23 行、跌停池 83 行、昨日涨停 81 行。
- 涨停表现：四档晋级率、市场宽度和今日结论均显示原版结果。
- 1920×1080 下六个页面横向溢出均为 0；日间、夜间背景与面板状态正常；浏览器控制台无迁移错误。

## 4. 自动验证

| 验证 | 结果 |
|---|---:|
| `python -m unittest discover -s tests -q` | 248 项通过 |
| `python -m unittest tests.test_preservation_slice_sentiment_pools -q` | 6 项通过 |
| 情绪、总览、缓存、iFinD 与前端契约专项集合 | 48 项通过 |
| `npx.cmd playwright test --reporter=dot` | 45 项通过 |
| `python -m compileall -q ...` | 通过 |
| `git diff --check` | 通过 |

Windows 下由 Playwright 自行创建临时静态服务器时，45 项完成后子进程无法回收；改为预先启动同一个
`8876` 静态服务器并让 Playwright 复用后，测试以零退出码正常结束，结果为 `45 passed (2.1m)`。

## 5. 保留边界

- 板块轮动仍调用情绪历史公共函数，待切片 04 与市场天梯一并归位。
- 竞价、题材、人气和龙虎榜对股池数据的消费保持原调用路径，待切片 05 迁移。
- 根级情绪引擎兼容模块、`DashboardService` 与 `ReviewDatabase` 兼容面继续保留；数据库内尚未迁移的
  选股统计方法仍走兼容别名，待切片 06 随完整方法一并归位。
- 没有删除待定代码、没有改动根目录正式数据库、没有切换 Docker/NAS。
