diff --git a/app/backend/features/heaven/repository.py b/app/backend/features/heaven/repository.py index 0dc8115..b8d4162 100644 --- a/app/backend/features/heaven/repository.py +++ b/app/backend/features/heaven/repository.py @@ -7,6 +7,35 @@ from typing import Any class HeavenRepositoryMixin: + def list_sector_phase_overrides(self) -> dict[str, str]: + with self.connect() as connection: + rows = connection.execute( + "SELECT name, element FROM sector_phase_overrides ORDER BY updated_at DESC, name" + ).fetchall() + return {row["name"]: row["element"] for row in rows} + + def save_sector_phase_override(self, name: str, element: str) -> None: + now = datetime.now().astimezone().isoformat(timespec="seconds") + with self.connect() as connection: + connection.execute( + """ + INSERT INTO sector_phase_overrides (name, element, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(name) DO UPDATE SET + element = excluded.element, + updated_at = excluded.updated_at + """, + (name, element, now), + ) + + def delete_sector_phase_override(self, name: str) -> bool: + with self.connect() as connection: + cursor = connection.execute( + "DELETE FROM sector_phase_overrides WHERE name = ?", + (name,), + ) + return cursor.rowcount > 0 + @staticmethod def _heaven_reading_dict(row: sqlite3.Row | None) -> dict[str, Any] | None: if not row: diff --git a/app/config/architecture-inventory.json b/app/config/architecture-inventory.json index 3136cf7..027a0e6 100644 --- a/app/config/architecture-inventory.json +++ b/app/config/architecture-inventory.json @@ -384,8 +384,8 @@ }, { "path": "database.py", - "bytes": 33284, - "lines": 746 + "bytes": 32073, + "lines": 716 } ] } diff --git a/app/database.py b/app/database.py index 180f691..b9c3a73 100644 --- a/app/database.py +++ b/app/database.py @@ -2,7 +2,7 @@ from __future__ import annotations import json import sqlite3 -from datetime import datetime, timezone +from datetime import datetime from pathlib import Path from typing import Any @@ -665,36 +665,6 @@ class ReviewDatabase( ) MigrationRunner().apply(connection, MIGRATIONS) - - - def list_sector_phase_overrides(self) -> dict[str, str]: - with self.connect() as connection: - rows = connection.execute( - "SELECT name, element FROM sector_phase_overrides ORDER BY updated_at DESC, name" - ).fetchall() - return {row["name"]: row["element"] for row in rows} - - def save_sector_phase_override(self, name: str, element: str) -> None: - now = datetime.now().astimezone().isoformat(timespec="seconds") - with self.connect() as connection: - connection.execute( - """ - INSERT INTO sector_phase_overrides (name, element, updated_at) - VALUES (?, ?, ?) - ON CONFLICT(name) DO UPDATE SET - element = excluded.element, - updated_at = excluded.updated_at - """, - (name, element, now), - ) - - def delete_sector_phase_override(self, name: str) -> bool: - with self.connect() as connection: - cursor = connection.execute( - "DELETE FROM sector_phase_overrides WHERE name = ?", - (name,), - ) - return cursor.rowcount > 0 def list_wencai_saved_queries( self, user_id: int, limit: int = 30 ) -> list[dict[str, Any]]: diff --git a/app/tests/test_preservation_slice_heaven.py b/app/tests/test_preservation_slice_heaven.py index 4aa489a..49d3dee 100644 --- a/app/tests/test_preservation_slice_heaven.py +++ b/app/tests/test_preservation_slice_heaven.py @@ -38,6 +38,9 @@ HEAVEN_SERVICE_METHODS = { } HEAVEN_REPOSITORY_METHODS = { + "list_sector_phase_overrides", + "save_sector_phase_override", + "delete_sector_phase_override", "_heaven_reading_dict", "save_heaven_reading", "list_heaven_readings", diff --git a/docs/governance/code-reduction.md b/docs/governance/code-reduction.md index f779ee5..c044075 100644 --- a/docs/governance/code-reduction.md +++ b/docs/governance/code-reduction.md @@ -27,6 +27,7 @@ | CR-07 | 数据Provider组装 | 核查网关、容器和业务服务是否重复创建外部数据客户端 | 固化唯一创建位置及兼容例外,不改数据源语义 | 已完成 | | CR-08 | NDJSON流式传输 | 问师与复盘助手重复维护响应头、事件写入、完成、断线及关闭流程 | HTTP共享层拥有唯一流式连接生命周期 | 已完成 | | CR-09 | 应用服务门面 | 两个仅服务股池iFinD补全的方法仍错位在全局`DashboardService` | 原函数体机械归位到`PoolServiceMixin` | 已完成 | +| CR-10 | Repository所有权 | 五行行业阶段覆盖的三项持久化方法仍错位在根级数据库门面 | 原函数体机械归位到问天Repository,兼容数据继续保留 | 已完成 | ## CR-01验收口径 @@ -226,6 +227,26 @@ 本批基线为`xiaobai-reduction-08-ndjson-transport-20260801`;检查点为 `xiaobai-reduction-09-service-facade-20260801`。 +## CR-10验收口径 + +- 只移动调用方、数据表和业务含义均明确属于单一领域的方法;数据库连接、事务和返回值必须保持不变。 +- `list_sector_phase_overrides`、`save_sector_phase_override`与`delete_sector_phase_override`必须由 + `backend/features/heaven/repository.py`拥有,并继续通过`ReviewDatabase`的Mixin解析。 +- 不修改表结构、迁移顺序、时间格式、排序、冲突更新或删除结果语义。 +- `wencai_saved_queries`及其三个方法属于已登记的账户隔离兼容数据;即使前端入口已取消,也必须保留。 + +## CR-10结果 + +- 将五行行业阶段覆盖的查询、保存和删除三个方法从根级`database.py`机械移动到问天Repository; + 调用名称、SQL、事务边界、时间值和返回结果均未改变。 +- 根级数据库门面不再直接拥有问天领域的持久化实现,问财历史兼容表和方法完整保留,未扩大删除范围。 +- 34项Repository、问天、账户隔离、清理契约及迁移定向测试通过;候选324项、纯`app/`导出261项、 + 24个JavaScript文件、API/架构注册表、Git空白检查和SQLite完整性检查通过。 +- 本批不修改页面、CSS、API、数据库结构、行情、数据源、业务计算、LLM、权限或后台任务。 + +本批基线为`xiaobai-reduction-09-service-facade-20260801`;检查点为 +`xiaobai-reduction-10-repository-ownership-20260801`。 + ## 人工验收记录 - 2026-08-01:用户检查CR-02与CR-03运行结果,确认未发现明显异常。本记录仅表示本轮可见功能与