# Tasks: Config to MySQL

## 1. 数据模型与配置存储模块

- [x] 1.1 在 `app/models.py` 中新增 `AppConfig` 模型
- [x] 1.2 创建 `app/config_store.py`，实现 `ConfigStore` 类
- [x] 1.3 实现 `get_config(key)` 方法，支持 MySQL → JSON 降级
- [x] 1.4 实现 `set_config(key, value)` 方法，支持 MySQL + JSON 双写
- [x] 1.5 实现 `_load_json(key, fallback)` 和 `_save_to_json(key, value)` 辅助方法

## 2. 数据迁移

- [x] 2.1 创建 `app/config_migration.py`，实现 `migrate_configs_to_mysql()`
- [x] 2.2 在 `app/main.py` lifespan 中创建 `app_config` 表
- [x] 2.3 在 `app/main.py` lifespan 中调用迁移函数
- [x] 2.4 迁移幂等性：数据库已有配置时跳过

## 3. 修改配置 API

- [x] 3.1 修改 `app/api/config.py` 使用 `ConfigStore` 读写 `symbols` 配置
- [x] 3.2 修改 `app/api/ai_config.py` 使用 `ConfigStore` 读写 `ai` 配置
- [x] 3.3 保持 API 接口签名不变

## 4. 修改业务使用方

- [x] 4.1 修改 `app/api/futures_analysis.py` 从 `ConfigStore` 读取品种配置
- [x] 4.2 修改 `app/api/trade_review.py` 从 `ConfigStore` 读取品种配置
- [x] 4.3 修改 `app/services/trade_parser.py` 从 `ConfigStore` 读取品种配置
- [x] 4.4 修改 `app/services/plan_generator.py` 从 `ConfigStore` 读取品种配置
- [x] 4.5 修改 `app/services/ai_analysis.py` 从 `ConfigStore` 读取 AI 配置

## 5. 测试与验证

- [x] 5.1 编写 `tests/test_config_store.py`，覆盖 MySQL 命中/未命中/降级场景
- [x] 5.2 编写迁移测试，验证幂等性
- [x] 5.3 运行全部测试套件，确保无回归（110 passed, 2 xfailed）
- [x] 5.4 启动应用验证配置读取正常
