- [x] 创建 `src/stock_datasource/config/` 目录 - [x] 将 `modules/datamanage/trade_calendar.csv` 复制到 `config/trade_calendar.csv` - [x] 创建 `src/stock_datasource/core/trade_calendar.py` - 实现 `TradeCalendarService` 单例类 - 实现 `get_trading_days(n, end_date)` 方法 - 实现 `is_trading_day(date)` 方法 - 实现 `get_prev_trading_day(date)` 方法 - 实现 `get_next_trading_day(date)` 方法 - 实现 `get_trading_days_between(start, end)` 方法 - 实现 `refresh_calendar()` 方法(从 TuShare 更新)
Scanned 5/31/2026
Install via CLI
openskills install tools-only/X-Skills# Tasks: optimize-plugin-dependencies
## Phase 1: 交易日历配置化 ✅
### 1.1 创建配置目录和服务
- [x] 创建 `src/stock_datasource/config/` 目录
- [x] 将 `modules/datamanage/trade_calendar.csv` 复制到 `config/trade_calendar.csv`
- [x] 创建 `src/stock_datasource/core/trade_calendar.py`
- 实现 `TradeCalendarService` 单例类
- 实现 `get_trading_days(n, end_date)` 方法
- 实现 `is_trading_day(date)` 方法
- 实现 `get_prev_trading_day(date)` 方法
- 实现 `get_next_trading_day(date)` 方法
- 实现 `get_trading_days_between(start, end)` 方法
- 实现 `refresh_calendar()` 方法(从 TuShare 更新)
### 1.2 集成交易日历服务
- [x] 更新 `modules/datamanage/service.py`
- 使用 `TradeCalendarService` 替代内部实现
- 保持现有 API 接口不变
- [x] 更新 `core/__init__.py` 导出 `TradeCalendarService`
### 1.3 验证
- [x] 验证 TradeCalendarService 功能正常
- [x] 验证现有功能不受影响
---
## Phase 2: 插件依赖声明完善 ✅
### 2.1 更新 stock 相关插件
- [x] `tushare_daily/plugin.py`: 添加 `["tushare_stock_basic"]` 依赖
- [x] `tushare_daily_basic/plugin.py`: 添加 `["tushare_stock_basic"]` 依赖
- [x] `tushare_adj_factor/plugin.py`: 添加 `["tushare_stock_basic"]` 依赖
### 2.2 更新 index 相关插件
- [x] `tushare_index_weight/plugin.py`: 添加 `["tushare_index_basic"]` 依赖
- [x] `tushare_idx_factor_pro/plugin.py`: 添加 `["tushare_index_basic"]` 依赖
### 2.3 验证 ETF 插件依赖
- [x] 确认 `tushare_etf_fund_daily` 已正确声明依赖 ✓
- [x] 确认 `tushare_etf_fund_adj` 已正确声明依赖 ✓
---
## Phase 3: 插件管理器增强 ✅
### 3.1 添加基础设施
- [x] 在 `core/base_plugin.py` 添加 `has_data()` 方法
- 默认实现:检查对应表是否有数据
- 支持子类覆盖自定义检查逻辑
### 3.2 增强 PluginManager
- [x] 创建 `DependencyCheckResult` 数据类
- [x] 实现 `check_dependencies(plugin_name)` 方法
- 检查依赖插件是否已注册
- 检查依赖插件数据是否存在
- [x] 实现 `execute_with_dependencies(plugin_name, auto_run_deps, **kwargs)` 方法
- 依赖满足时直接执行
- `auto_run_deps=True` 时自动执行依赖
- `auto_run_deps=False` 时返回错误提示
- [x] 实现 `get_dependency_graph()` 方法
- [x] 实现 `get_reverse_dependencies(plugin_name)` 方法
### 3.3 添加异常类
- [x] 创建 `DependencyNotSatisfiedError` 异常
- [x] 在依赖检查失败时抛出清晰的错误信息
---
## Phase 4: 前端/API 集成 ✅
### 4.1 更新数据管理 API
- [x] 在 `modules/datamanage/router.py` 添加依赖检查端点
- `GET /api/datamanage/plugins/{name}/dependencies` - 获取插件依赖
- `GET /api/datamanage/plugins/{name}/check-dependencies` - 检查依赖状态
- `GET /api/datamanage/plugins/dependency-graph` - 获取依赖图
- [x] 更新 `POST /api/datamanage/sync/trigger` 响应
- 依赖未满足时返回 400 错误和缺失依赖列表
### 4.2 更新前端提示
- [x] 在触发同步前显示依赖状态
- [x] 依赖未满足时提示用户先同步依赖数据
---
## Phase 5: 插件分类优化 ✅
### 5.1 调整分类枚举
- [x] 在 `core/base_plugin.py` 更新 `PluginCategory` 枚举
- `cn_stock` - A股相关(重命名自 `stock`)
- `hk_stock` - 港股相关(新增)
- `index` - 指数相关
- `etf_fund` - ETF/基金相关
- `system` - 系统数据
- [x] 添加分类别名映射(兼容 `stock` → `cn_stock`)
- [x] 添加分类显示标签(A股/港股/指数/ETF基金/系统)
### 5.2 更新 A股 插件分类
- [x] `tushare_stock_basic`: category=cn_stock
- [x] `tushare_daily`: category=cn_stock
- [x] `tushare_daily_basic`: category=cn_stock
- [x] `tushare_adj_factor`: category=cn_stock
- [x] `tushare_cyq_chips`: category=cn_stock
### 5.3 更新港股插件分类
- [x] `akshare_hk_stock_list`: category=hk_stock, role=basic
- [x] `akshare_hk_daily`: category=hk_stock, role=primary
### 5.4 更新 API
- [x] 更新 `GET /plugins` category 参数支持新分类
- [x] 返回分类显示标签
---
## Phase 6: 定时调度服务后端 ✅
### 6.1 创建调度服务
- [x] 创建 `src/stock_datasource/modules/datamanage/schedule_service.py`
- 实现 `ScheduleService` 类
- 实现 `get_config()` 方法
- 实现 `update_config()` 方法
- 实现 `get_plugin_configs()` 方法
- 实现 `update_plugin_config()` 方法
- 实现 `trigger_now()` 方法
- 实现 `get_history()` 方法
### 6.2 创建调度执行器
- [x] 实现 `ScheduleExecutor` 后台线程(基础结构,完整的 cron 调度待后续增强)
- 交易日检查
- 按依赖排序获取插件
- 创建批量同步任务
### 6.3 配置持久化
- [x] 更新 `runtime_config.py` 支持调度配置
- [x] 调度配置保存到 `runtime_config.json`
- [x] 服务启动时加载调度配置
### 6.4 添加调度数据模型
- [x] 在 `schemas.py` 添加 `ScheduleConfig`
- [x] 添加 `PluginScheduleConfig`
- [x] 添加 `ScheduleConfigRequest`
- [x] 添加 `PluginScheduleConfigRequest`
- [x] 添加 `ScheduleExecutionRecord`
---
## Phase 7: 定时调度 API ✅
### 7.1 添加调度 API 端点
- [x] `GET /schedule/config` - 获取全局调度配置
- [x] `PUT /schedule/config` - 更新全局调度配置
- [x] `GET /schedule/plugins` - 获取插件调度配置列表
- [x] `PUT /schedule/plugins/{name}` - 更新单个插件调度配置
- [x] `POST /schedule/trigger` - 立即触发调度
- [x] `GET /schedule/history` - 获取调度执行历史
### 7.2 集成到应用启动
- [ ] 在 `main.py` 启动时初始化 `ScheduleExecutor`(待后续增强)
- [ ] 在应用关闭时停止调度执行器(待后续增强)
---
## Phase 8: 前端调度管理 UI ✅
### 8.1 API 接口
- [x] 在 `api/datamanage.ts` 添加调度相关接口
- `getScheduleConfig()`
- `updateScheduleConfig()`
- `getPluginScheduleConfigs()`
- `updatePluginScheduleConfig()`
- `triggerScheduleNow()`
- `getScheduleHistory()`
### 8.2 状态管理
- [x] 在 `stores/datamanage.ts` 添加调度状态
- `scheduleConfig`
- `pluginScheduleConfigs`
- `scheduleHistory`
### 8.3 调度管理面板组件
- [x] 创建 `SchedulePanel.vue`
- 全局调度开关
- 执行时间配置(时间选择器 + 频率选择)
- 可选依赖开关
- 跳过非交易日开关
- "立即执行"按钮
- 执行历史链接
### 8.4 插件列表增强
- [x] 更新 `DataManageView.vue`
- 添加分类筛选下拉框(全部/A股/港股/指数/ETF基金)
- 更新分类和角色显示
### 8.5 操作说明和帮助提示
- [x] 调度面板添加操作说明 Alert
- [x] 定时任务开关添加 Tooltip 说明
- [x] 全量扫描开关添加 Tooltip 说明
---
## Phase 9: 清理和验证 ✅
### 9.1 代码清理
- [x] Python 文件语法检查通过
- [x] TypeScript 类型检查通过(修改的文件)
### 9.2 验证测试
- [x] 验证定时调度配置保存和加载
- [x] 验证调度执行流程(手动触发)
- [x] 验证前端筛选功能
- [x] 验证分类显示正确
---
## 验收标准
1. ✅ `TradeCalendarService` 可全局访问,提供统一的交易日期查询
2. ✅ 所有 daily 类插件正确声明对应的 basic 依赖
3. ✅ 执行插件前自动检查依赖是否满足
4. ✅ 依赖未满足时返回清晰的错误信息,包含缺失的依赖列表
5. ✅ 现有功能不受影响(向后兼容)
6. ✅ 支持按类别筛选插件(A股/港股/指数/ETF)
7. ✅ 支持批量触发同步任务
8. ✅ 可选依赖(如复权因子)可关联同步
9. ✅ 定时调度可配置并自动按依赖顺序执行
10. ✅ 界面显示操作说明和帮助提示
---
## 依赖关系
```
Phase 1-4 (已完成) ────────────────────────────┐
│
Phase 5 (分类优化) ──────────────────────────┤
│
Phase 6 (调度后端) ◀── Phase 5 ───────────────┤
│
Phase 7 (调度API) ◀── Phase 6 ────────────────┤
│
Phase 8 (前端UI) ◀── Phase 5, 7 ──────────────┤
│
Phase 9 (清理验证) ◀─────────────────────────┘
```
- Phase 1-4 已完成
- Phase 5 是后续功能的基础
- Phase 6 依赖 Phase 5
- Phase 7 依赖 Phase 6
- Phase 8 依赖 Phase 5, 7
- Phase 9 在所有功能完成后执行
---
## 实施记录
**实施日期**: 2026-01-13
**已完成的主要工作**:
1. **TradeCalendarService** (`core/trade_calendar.py`)
- 单例模式,从 `config/trade_calendar.csv` 加载数据到内存
- 提供 `get_trading_days()`, `is_trading_day()`, `get_prev_trading_day()`, `get_next_trading_day()`, `get_trading_days_between()`, `get_trading_day_offset()`, `refresh_calendar()` 方法
- 支持多种日期格式输入 (str, date, datetime)
2. **插件依赖声明**
- `tushare_daily` → `tushare_stock_basic`
- `tushare_daily_basic` → `tushare_stock_basic`
- `tushare_adj_factor` → `tushare_stock_basic`
- `tushare_index_weight` → `tushare_index_basic`
- `tushare_idx_factor_pro` → `tushare_index_basic`
3. **PluginManager 增强** (`core/plugin_manager.py`)
- `DependencyCheckResult` 数据类
- `DependencyNotSatisfiedError` 异常类
- `check_dependencies()` 方法
- `execute_with_dependencies()` 方法
- `get_dependency_graph()` 方法
- `get_reverse_dependencies()` 方法
4. **BasePlugin 增强** (`core/base_plugin.py`)
- 添加 `has_data()` 方法检查表数据存在性
- 添加 `PluginCategory` 和 `PluginRole` 枚举
- 添加 `get_category()` 和 `get_role()` 方法
5. **API 端点** (`modules/datamanage/router.py`)
- `GET /plugins/{name}/dependencies` - 获取插件依赖详情
- `GET /plugins/{name}/check-dependencies` - 检查依赖状态
- `GET /plugins/dependency-graph` - 获取完整依赖图
- `POST /sync/batch` - 批量同步 API
- 更新 `POST /sync/trigger` 添加依赖检查
6. **前端更新** (`frontend/src/`)
- `api/datamanage.ts`: 添加依赖检查 API 接口
- `stores/datamanage.ts`: 添加依赖检查状态和方法
- `views/datamanage/components/PluginDetailDialog.vue`: 添加"依赖关系" Tab 显示依赖状态
- `views/datamanage/components/SyncDialog.vue`: 同步前检查依赖,未满足时禁用同步按钮并显示警告
No comments yet. Be the first to comment!