diff --git a/backend/app/plugins/stocksdk/provider.py b/backend/app/plugins/stocksdk/provider.py index c3481a4..97edeb0 100644 --- a/backend/app/plugins/stocksdk/provider.py +++ b/backend/app/plugins/stocksdk/provider.py @@ -203,7 +203,16 @@ class StockSDKProvider: except bridge.StockSDKBridgeError as e: logger.warning("stock-sdk realtime 拉取失败: %s", e) return [] - return result.get("rows") or [] + rows = result.get("rows") or [] + normalized: list[dict] = [] + for row in rows: + item = dict(row) + # stock-sdk 的 changePercent 是百分数值(-1.15 = -1.15%); + # provider 入口契约统一使用小数制(-0.0115 = -1.15%)。 + if item.get("change_pct") is not None: + item["change_pct"] = float(item["change_pct"]) / 100 + normalized.append(item) + return normalized # ---- instruments (标的维表) ---- def get_instruments(self, asset_type: str = "stock") -> list[dict]: diff --git a/backend/tests/test_stocksdk_provider.py b/backend/tests/test_stocksdk_provider.py index d6ddc57..b6a2b4d 100644 --- a/backend/tests/test_stocksdk_provider.py +++ b/backend/tests/test_stocksdk_provider.py @@ -80,12 +80,14 @@ def test_get_minute_datetime_is_beijing_wall_clock(monkeypatch): assert df["symbol"][0] == "600519.SH" -def test_get_realtime_passthrough(monkeypatch): +def test_get_realtime_normalizes_change_pct_to_decimal(monkeypatch): rows = [{"symbol": "600519.SH", "name": "贵州茅台", "last_price": 1200.0, - "prev_close": 1194.0, "open": 1186.0, "high": 1203.0, "low": 1180.0, "volume": 16325}] + "prev_close": 1194.0, "open": 1186.0, "high": 1203.0, "low": 1180.0, + "volume": 16325, "change_pct": -1.15}] _patch_run_job(monkeypatch, {"realtime": {"ok": True, "op": "realtime", "rows": rows}}) out = StockSDKProvider().get_realtime() - assert out == rows + assert abs(out[0]["change_pct"] - (-0.0115)) < 1e-12 + assert rows[0]["change_pct"] == -1.15 required = {"symbol", "last_price", "prev_close", "open", "high", "low", "volume"} assert required <= set(out[0].keys())