diff --git a/app/backend/application.py b/app/backend/application.py index f0abec4..95dea4e 100644 --- a/app/backend/application.py +++ b/app/backend/application.py @@ -472,38 +472,6 @@ class DashboardService( **self.database.status(), } - - - - - - @staticmethod - def _ifind_field(row: dict[str, Any], tokens: tuple[str, ...]) -> Any: - for key, value in row.items(): - label = str(key or "") - if any(token.casefold() == label.casefold() for token in tokens): - return value - for key, value in row.items(): - label = str(key or "") - if any(token in label for token in tokens): - return value - return None - - @classmethod - def _ifind_row_code(cls, row: dict[str, Any]) -> str: - value = cls._ifind_field(row, ("股票代码", "证券代码", "代码", "thscode")) - match = re.search(r"(? Any: + for key, value in row.items(): + label = str(key or "") + if any(token.casefold() == label.casefold() for token in tokens): + return value + for key, value in row.items(): + label = str(key or "") + if any(token in label for token in tokens): + return value + return None + + @classmethod + def _ifind_row_code(cls, row: dict[str, Any]) -> str: + value = cls._ifind_field(row, ("股票代码", "证券代码", "代码", "thscode")) + match = re.search(r"(? str: text = str(value or "").strip() diff --git a/app/config/architecture-inventory.json b/app/config/architecture-inventory.json index 413b671..3136cf7 100644 --- a/app/config/architecture-inventory.json +++ b/app/config/architecture-inventory.json @@ -374,8 +374,8 @@ }, { "path": "backend/application.py", - "bytes": 48513, - "lines": 1119 + "bytes": 47552, + "lines": 1087 }, { "path": "frontend/styles/theme.css", diff --git a/app/tests/test_preservation_slice_sentiment_pools.py b/app/tests/test_preservation_slice_sentiment_pools.py index 7d261ca..d8a87e7 100644 --- a/app/tests/test_preservation_slice_sentiment_pools.py +++ b/app/tests/test_preservation_slice_sentiment_pools.py @@ -29,6 +29,8 @@ POOL_METHODS = { "_apply_reason_overrides", "_schedule_ifind_event_enrichment", "_refresh_ifind_event_enrichment", + "_ifind_field", + "_ifind_row_code", "_normalize_ifind_event_time", "_merge_ifind_event_enrichment", } diff --git a/docs/governance/code-reduction.md b/docs/governance/code-reduction.md index 46b851f..f779ee5 100644 --- a/docs/governance/code-reduction.md +++ b/docs/governance/code-reduction.md @@ -26,6 +26,7 @@ | CR-06 | 紧凑日期显示 | Tushare与选股引擎各保留一份完全相同的`YYYYMMDD`显示转换 | 由`bootstrap/config.py`拥有唯一格式策略,消费者保留原局部别名 | 已完成 | | CR-07 | 数据Provider组装 | 核查网关、容器和业务服务是否重复创建外部数据客户端 | 固化唯一创建位置及兼容例外,不改数据源语义 | 已完成 | | CR-08 | NDJSON流式传输 | 问师与复盘助手重复维护响应头、事件写入、完成、断线及关闭流程 | HTTP共享层拥有唯一流式连接生命周期 | 已完成 | +| CR-09 | 应用服务门面 | 两个仅服务股池iFinD补全的方法仍错位在全局`DashboardService` | 原函数体机械归位到`PoolServiceMixin` | 已完成 | ## CR-01验收口径 @@ -206,6 +207,25 @@ 本批基线为`xiaobai-reduction-07-provider-ownership-20260801`;检查点为 `xiaobai-reduction-08-ndjson-transport-20260801`。 +## CR-09验收口径 + +- 只有消费者全部属于单一领域、且能够按原函数体机械移动的方法才从应用门面移出。 +- `_ifind_field`与`_ifind_row_code`继续保持静态/类方法签名、字段优先级、大小写规则和代码正则。 +- 账号委托属于稳定公开门面;系统设置属于跨领域协调;后台刷新留到CR-11,本批均不得删除或重写。 +- 移动后`DashboardService`必须继续通过Mixin解析同名方法,调用点和返回值不变。 + +## CR-09结果 + +- 将iFinD字段匹配和股票代码提取两个方法从应用大类机械移动到股池服务,原版与迁移方法AST逐项 + 相等;应用大类不再直接拥有股池专属实现。 +- 连同迁移期遗留空行,`backend/application.py`减少32行,股池服务增加24行,生产代码净减少8行。 +- 候选324项、纯`app/`导出261项、24个JavaScript文件、API/架构注册表、Git空白检查和SQLite + 完整性检查通过;本批不涉及页面、CSS或浏览器行为。 +- 本批不修改字段匹配、涨跌停原因补全、接口、数据源、缓存、数据库、权限或前端。 + +本批基线为`xiaobai-reduction-08-ndjson-transport-20260801`;检查点为 +`xiaobai-reduction-09-service-facade-20260801`。 + ## 人工验收记录 - 2026-08-01:用户检查CR-02与CR-03运行结果,确认未发现明显异常。本记录仅表示本轮可见功能与