refactor(resources): 清理导入导出残留并合并包处理逻辑

移除无调用的前端策略包接口封装和类型,将依赖收集、ZIP 打包与安全检查、资源预检统一到 resource_bundle,strategy_bundle 仅保留兼容入口。

保留旧包和旧接口的逐文件导入语义,以及当前资源导入的整批预检和回滚;补充新旧导出格式互通、本机依赖解析、逐文件失败报告和 ZIP 安全回归测试。

验证:相关后端回归 106 项、后端完整测试 3726 项、前端测试 389 项通过;前端构建、Ruff 与 git diff --check 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
This commit is contained in:
shy3130
2026-10-30 22:29:44 +08:00
parent 5a4702edcb
commit c63ee7648c
7 changed files with 582 additions and 649 deletions
+2 -2
View File
@@ -24,8 +24,8 @@
- 当前后端继承点:`NotificationFormatter`。
- 自定义仓位策略(`PositionSizingPolicy`,已实现):`data/user_data/position_policies/*.py`,在「设置 → 定义 → 仓位策略」创建(表单 META + 只写一个 `def compute(ctx)` 函数,模板起步)。契约见 `app/backtest/position_sizing.py`:ctx 只含当日及以前信息(候选评分/近 60 日收益/已平仓快照/组合状态/参数),输出 weights + budget_scale,引擎侧单仓上限/现金/敞口钳制不变。保存/备份导入均过「AST 安全校验 → 结构解析 → 合成冒烟」三关;回测在「买入权重 → 自定义策略」选用,引用失效 400 拒绝、运行期异常当日回退等权并计入统计。
- 因子平台与策略线的既有桥接(已实现,二开时直接复用、勿重复实现):因子库一键生成单因子排名策略(`GenerateFactorStrategyDialog` → `custom_factor_*`);策略触发器引用因子条件信号(`AddFactorSignalDialog`,`csg_f_*`);自定义信号 AI 提示词含因子分组(`custom_signals_ai.py`);策略回测因子归因(`strategy.py` 的 `factor_attribution`,覆盖 `meta.scoring` 非空的策略)。
- 旧策略包格式与接口(兼容保留):按依赖闭包打包策略 `.py` + 引用的自定义信号/因子定义 + 用户调参(叠加策略含子策略)。服务层 `app/services/strategy_bundle.py`;旧导入复用 `config_backup.apply_archive` 的校验/逐条写盘/冒烟管线,缺失依赖在旧预览中只作预警。包内仅允许策略/调参/信号/因子四类,其他路径 400 拒绝。API:`GET /api/strategies/{id}/bundle`、`POST /api/strategies/bundle/inspect|apply`;当前页面入口使用下述统一资源传输。
- 统一资源传输(已实现):策略、因子、信号页各使用一个 `ResourceTransferButton` 图标,在当前页打开 `ResourceTransferDialog`;`kind` 限定主资源列表类型,依赖统一展示并自动携带。多文件识别后优先选择同类型原始项,没有此类型原始项时允许从混合包提取该类型定义;确认冲突后只提交所选项及其依赖。`StrategyExportButton` 与弹窗共用 `downloadResourceBundle`,单个策略和批量导出均下载 ZIP,包含所需因子、信号与已保存调参。处理期间禁用关闭,关闭后重开重置临时状态。服务层 `app/services/resource_bundle.py` 复用 `strategy_bundle.collect_resources`、备份路径/安全校验/原子写与定义编译;新包格式 `tick-resource-bundle` v1,兼容旧策略包。预览通过 `registry.isolated_registry()` 在请求上下文副本内检查同包因子,不向实时线程泄漏定义;新导入链路预检后整批提交,写入/注册/重载失败回滚,区别于旧备份接口的逐条容错语义。API 位于 `/api/definitions/resources`,详见 [策略文档](strategy.md#资源导入与批量导出)。
- 旧策略包格式与接口(兼容保留):按依赖闭包打包策略 `.py` + 引用的自定义信号/因子定义 + 用户调参(叠加策略含子策略)。`app/services/strategy_bundle.py` 只保留兼容入口,实际实现统一位于 `app/services/resource_bundle.py`;新旧接口共用依赖闭包、ZIP 安全校验、打包与资源预检,旧导入复用 `config_backup.apply_archive` 的校验/逐条写盘/冒烟管线,缺失依赖在旧预览中只作预警。包内仅允许策略/调参/信号/因子四类,其他路径 400 拒绝。API:`GET /api/strategies/{id}/bundle`、`POST /api/strategies/bundle/inspect|apply`;当前页面入口使用下述统一资源传输。
- 统一资源传输(已实现):策略、因子、信号页各使用一个 `ResourceTransferButton` 图标,在当前页打开 `ResourceTransferDialog`;`kind` 限定主资源列表类型,依赖统一展示并自动携带。多文件识别后优先选择同类型原始项,没有此类型原始项时允许从混合包提取该类型定义;确认冲突后只提交所选项及其依赖。`StrategyExportButton` 与弹窗共用 `downloadResourceBundle`,单个策略和批量导出均下载 ZIP,包含所需因子、信号与已保存调参。处理期间禁用关闭,关闭后重开重置临时状态。服务层 `app/services/resource_bundle.py` 统一收集多资源依赖闭包,复用备份路径/原子写与定义编译;新包格式 `tick-resource-bundle` v1,兼容旧策略包。预览通过 `registry.isolated_registry()` 在请求上下文副本内检查同包因子,不向实时线程泄漏定义;新导入链路预检后整批提交,写入/注册/重载失败回滚,区别于旧备份接口的逐条容错语义。API 位于 `/api/definitions/resources`,详见 [策略文档](strategy.md#资源导入与批量导出)。
- 模拟盘「绑定即评估」(已实现,`app/strategy/paper_watch.py`):账户绑定策略(自动跟单规则 `match_kind=strategy`)即自动进入实时评估循环——引擎内存态注入合成规则(`paper_watch:{strategy_id}`,不落盘、不进监控页),事件照常喂 `paper_auto.on_rule_events`。同步幂等且与真监控规则去重(同策略已有启用中的监控规则则不注入,避免重复事件);`set_rules` 是全量覆盖,故监控规则任何保存后都会重注入。合成规则的信号是沙盒信号:只驱动模拟盘下单,不进 SSE 告警/系统通知/webhook/留痕(`quote_service` 按 `is_paper_watch_event` 分流)。
尚未实现、只能在真实需求出现后增加的能力:
+1 -1
View File
@@ -84,7 +84,7 @@ AI 策略 `.py` 未声明发布状态时默认导入为草稿;资源包中明
资源包只包含策略/调参/信号/因子及策略辅助代码,不包含行情、计算缓存、账号或密钥;全量设备迁移仍使用「配置备份」。依赖识别覆盖评分、进出场信号、叠加条件、组合成员和源码中明确的自定义列引用;动态拼接的列名应通过 `META.required_features` 或 `REQUIRED_FEATURES` 显式声明。
新包使用 `tick-resource-bundle` v1,条目路径沿用配置备份白名单。统一接口位于 `/api/definitions/resources`:GET 查询目录;POST `/export/preview` 预览导出、`/export` 下载、`/inspect` 预览导入、`/apply` 提交导入。旧 `/api/strategies/{id}/bundle` 与旧策略包格式继续兼容。
新包使用 `tick-resource-bundle` v1,条目路径沿用配置备份白名单。统一接口位于 `/api/definitions/resources`:GET 查询目录;POST `/export/preview` 预览导出、`/export` 下载、`/inspect` 预览导入、`/apply` 提交导入。旧 `/api/strategies/{id}/bundle` 与旧策略包格式继续兼容;旧接口保留默认跳过同名文件、逐文件报告导入结果的行为。
清单由应用在导出 ZIP 时自动生成,用于保存原始选择、版本和依赖信息,不是手工导入的前置条件。无清单 ZIP 按文件内容识别资源;保留标准资源目录时也会保留策略来源、辅助模块与已保存调参。有清单的包仍校验其格式和版本,损坏或不兼容的清单会明确报错。