Skip to content
Back to skills

2479 Tasks 0628ed7c

ASecurity

- [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 更新)

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 31, 2026
developmenttypescriptpythongovueapifrontend

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 31, 2026

npx -y skills add tools-only/X-Skills --skill 2479-tasks_0628ed7c --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 2479 Tasks 0628ed7c?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 2479 Tasks 0628ed7c
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-2479-tasks-0628ed7c/badge)](https://www.skillsdirectory.com/skills/tools-only-2479-tasks-0628ed7c)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# 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`: 同步前检查依赖,未满足时禁用同步按钮并显示警告

Files in this skill

  • README.md1.4 KB
  • skill.md10.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.