From bcd478f701d520ad5b57946921dba18ed88dc39a Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 28 Apr 2026 11:37:21 +0800 Subject: [PATCH] 1 --- .../__pycache__/intraday.cpython-313.pyc | Bin 22093 -> 22284 bytes backend/app/analysis/intraday.py | 4 +- backend/app/data/eastmoney_client.py | 85 ++++++++++++++++-- backend/astock.db | Bin 2797568 -> 2797568 bytes 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/backend/app/analysis/__pycache__/intraday.cpython-313.pyc b/backend/app/analysis/__pycache__/intraday.cpython-313.pyc index 86170558173bbf43036e11fa8045ff457449dffe..c434f1730f0391edb6cadef0943d62aafdc1dbf7 100644 GIT binary patch delta 3270 zcmbW3du)@}6~OQH`|XezO6(z>Rx7AAOK1|4f4Q=>H z+IpInM0NA~gakQ1qS@<^v=wPB3Ff1dXi&qrSIuorxi+IH)GN~FbyO5&9p9*T*P0}q zXm0L@5MUE6V6jR{NhPTz&6h1#ujO&AkJ|Vl?K5hK5ll(6b6MwA8YBbXtMgL>KcicaYaGbUMsPTZWbCctR$md< z>0R0d^Tu8J+H$9)G!wB7-phAY=kI zEn8$Ozf|FA5WQka6QyJ|73uRzLblL-%5JqlWSdwjmcge~EEgBT-y+E(R*1eO202Hv z@#O}0d(J>ZHuXxes!6q)JQgE&pef@a<%)|losjdSymWu4pPw}3D<6$!4Q}_6YLf9> zN2`gPFXiWwu6jtiKq^Sj+qo#SLD??Z#cJ$j7_yh_A=unnH#DXtyRtpwD_QZ_gwdl0 zd`)7F-vm)jYa0nM5)XmBmWj1rvSWv2>%|UcAO5t#*6#S9`(H3`{|m&r%&ugobP_kAMxkxH}yb5dozbX_pH_xkr`SU86`Nu+)esb|VAGNqF?US{-`AL&~XOn2i zYV42v2imgH?P7B(Zi^pOkG$ut;~D74dKXJ>^piX(@5U6fnakeCS17`Xl6PL%)@(Xn zK4k8sZTy(|DWhF9H1A4zF5hb@^n1nSP5LsTBb}=5*%WsHmEAR7GO#$4i>xQOM;mM6q)nrA#S)avd|%PD!TuYmiTLy9;)E8mO?7U>n)X=!8s>MO>As}g(69PBp8d2j>(a26J4M$kMSq+pIn->#v^hl zBF6`ZgCiqD!O*4&0j&34{_VZvC+@s_;LhoNDa9x69=QAcU*G%r;X5Z@PrR1jOlc24 zU$9pLmy)msekQM&_VO3(rL>Vx+Rr7Tj(&v|t|Vd4A~qrh_*LgWtzSj)YlyD{d?ox= zVNvDdo?uB@v-u8go*0WqVhp>;i;DVbC!Z+#fR^x60S{mAQu85KseyxW5qx6X`J1k@ z>u;|Tr)=Iy?^RpbO<8a zO4F*5^7Yph6z=?WrGTRGAXl@7?jV~!E;QucDm>x}h zRMujk`*>mXRsr6zgw+C`WOe*db!qhmkdyk6Xe>S$4#p$hY(FYAv|%DVg!&>VO~kq zrpUG!3!^rOP$7oVu8c+E>^U5M69Hc~giRv0@Y}Txx|RREw$?g=idPU$#8JMiu96<( zp}G}LhKd|SsxCi43G-$X{5N$jdWheuYb`&3iWd;y0wi@%snA$B5=-jk$kw#TCV6XM z3Ej>&1=Ymd z9U~s*#c=|Vtme1dU0mIsL%X=6y=3P>wEO}9{WhWOLZqrxg;ETWi#Ut;1L7PajyR2& zKwJd)jO-(nw`hpn5#<208#KB+2V=~xfyiUH5T2cH#l4j{XO_yn;UFo(Y% z=JF6`ga*JQKy)!w%BM@Gm^u(x&7?j!IzAFz7@r77(pjcTk*$JH%Wh(X8N_bBv}>W^ zJc@{?6XC9Nlpaj@)~r+)=rBA@(%2U|!e3ffZs)rEd}DkiJyd zRiA;WP=O(mhREn(EE0;3u^8I{#-w&M7!N%k3B&Po^{i7n!Rd{}=AN%8%;RX*j0fd# zFvc$MbK(H}B=_{qK9kCTV=hs|qcij#&QOJ;p*X|)kW@zHIKxJ#>clWMJBh>8Vf3Pl ru61-QJTVek&K7e~`o@AClxn7GSKcQnp|k&CO1QsL#V<+QRXFcIXja1B delta 3086 zcmbVOdrVu`89&F@*KZqRz!-zE%`*nf!v+#aNPu)9qzVD9Z^Ft}aKJ3A!H{EFYnEmXFP51A&Xy{B`tN`_C;*RK00Pd{Y#t`!PcLGtq~a ztZkqvNfMhc6B6FfpVLh9ubSO%gDl8uS(G)O7u}%Y*R(!r$s@GyxMb!>bp8yBlp$H0R6Zg?n3Tyc>%4+q*7LV@eyZmdeO{KKKWim} z%}HcKZzX@jSHO4cUD~Ww`e}V#X|^m_h?FC%0qv^_HKb<-doF)ZUtXM-wnV7pjGEwY zmh!Vm2i<;}kVzFG6YujAKF6v?{Us-y2=H1zo zd?sgGqQKrv=`Ow}cUltwKMQheP9g2)7Dq9y=K;r@$go!v|8VrFtTIOIM%aVU#~;rB z)cQpfA42E{@Ok;Zf`Zbuk>E*MBjH$lY&;q{JaAxgJRXVhiv@l30j_nuO1=EHtAwAb z*YM9=F2gAZFNc4uhZhxIEnC!CzH5BSc-J&|*OYzNWWQ^2-Zd30nlf%%J@Y2--_2UR z;S*aT=q{#-KF?*9IV=#{#*ZAtv4egT;NIfnQ*t?dno1e!XWE<~UTvh3O?`EJdnqV$ zu6DiTAlJ*Nl%u|0-c|+5tJ#gAT5`icLpt3JqkyudGL$XeXrdvb?nZOl22fsW3p-4*qikyh%r$SLh&dGIn0FXLqA*|N2oYhv zSp)V3B7$W>6j0Vt7`I@gkZ-}FV5VZp)`a}}1t$%;EDQN2l*{!PS!<9>goS3e>=y3i zVYWMN5iEB~FdM&OxAR|@yiH$7{IGPRfll*e%^?#u0;>kt#%lPNYl~|nkdylTqp|qF za5x_6V(_*gNzFuLARZq}swVcbd@%UTY#rQ~pU>9L((`hItVhWA5B$je zrn`=v;g{>m=nVf;T}i_W;F*M{0rA}X_RPJfPW>S^^+2`y5eHquZY(h^r!cP!p_>-IcPNk^dp^lR&<&9dQQ`k@W>ziM!SVAMx zs`M5qNy|Jc?kga){L?XL1Cm4r3nQ5 zP+`A8xPovM;Q+!f5g5XC0H2X9qWmbrJi;-A)R93c#XLw!>N6m z_|eu4;`<=xB(AhxQ_+RQ(XFqkr*@$e=~%`sTE=6uoPjolL8Og!p{)=A_aCp;Wd|Vp zBf>if+W?mF{k@!xU_sCTuwH=CDqzW{OO>Z=JTjTohsP%NkCw$Jha;&96&kMKC}hB= zWeX_ZL3o0HyuHkD4Ml_*VO3x&gcC?Fj5!2Hojs3@N@Ye21=Ou8(bTHxwxkP_! z`jv^{hWIE;@F%(-vSD*EJq}kf_@W`qz(4G6p|9|oo*hF1Iv+vnAi`b*HQ16G7K^jd ziKM99Qr&_zq?!kJ)MsGu?FX%b;fBcAKrAv8A7?T47&w#Kv2c87Ut}1L-eS)#F&BbP zCTe@Xpt6jiTQd=k4u@lGjvo#6Qw#q?XmQUVIM^wK5rq5a=Mtz%_3-FWoMA5{h0$o7 z;U+6QG0e>_psE~1FNWwgjg1da?vHF{K5pARnD;oPn%i~l9}q?8==($wKKO>fPwf7> H8pr($jmU}C diff --git a/backend/app/analysis/intraday.py b/backend/app/analysis/intraday.py index 2cb43c3b..2e8c47bf 100644 --- a/backend/app/analysis/intraday.py +++ b/backend/app/analysis/intraday.py @@ -56,8 +56,10 @@ async def intraday_market_temperature(prev_temp: MarketTemperature) -> MarketTem down_count = sum(1 for q in eastmoney_quotes if q.get("pct_chg", 0) < 0) limit_up_count = sum(1 for q in eastmoney_quotes if q.get("pct_chg", 0) >= _limit_threshold(q.get("ts_code", ""))) limit_down_count = sum(1 for q in eastmoney_quotes if q.get("pct_chg", 0) <= -_limit_threshold(q.get("ts_code", ""))) + source = eastmoney_quotes[0].get("source", "eastmoney") if eastmoney_quotes else "eastmoney" logger.info( - "东方财富实时市场温度: 上涨=%s 下跌=%s 涨停=%s 跌停=%s (共%s只)", + "%s实时市场温度: 上涨=%s 下跌=%s 涨停=%s 跌停=%s (共%s只)", + "腾讯兜底" if source == "tencent_fallback" else "东方财富", up_count, down_count, limit_up_count, diff --git a/backend/app/data/eastmoney_client.py b/backend/app/data/eastmoney_client.py index a946eccf..fafdd9e0 100644 --- a/backend/app/data/eastmoney_client.py +++ b/backend/app/data/eastmoney_client.py @@ -31,6 +31,13 @@ SECTOR_HEADERS = { } +def _describe_exception(exc: Exception) -> str: + text = str(exc).strip() + if text: + return f"{exc.__class__.__name__}: {text}" + return exc.__class__.__name__ + + def _ts_code_to_eastmoney(ts_code: str) -> str: """600519.SH -> 1.600519 (上海=1, 深圳=0)""" code, market = ts_code.split(".") @@ -209,6 +216,7 @@ async def get_a_share_realtime_ranking( "total_mv": _safe_float(item.get("f20")), "circ_mv": _safe_float(item.get("f21")), "main_net_inflow": _safe_float(item.get("f62")) or 0, + "source": "eastmoney", }) if len(result) == before_count or len(items) < page_size_per_request: break @@ -225,12 +233,79 @@ async def get_a_share_realtime_ranking( logger.info("东方财富A股实时行情: 获取 %s 只", len(result)) return result except Exception as e: - logger.error(f"东方财富A股实时行情获取失败: {e}") - await log_error( - "eastmoney", - f"东方财富A股实时行情获取失败: {e}", - detail=f"sort_by={sort_by}, page_size={page_size}", + reason = _describe_exception(e) + logger.warning("东方财富A股实时行情获取失败,尝试腾讯兜底: %s", reason) + fallback = await _get_a_share_realtime_ranking_from_tencent( + sort_by=sort_by, + descending=descending, + page_size=page_size, ) + if fallback: + ttl = 60 if _is_trading_hours() else 300 + cache.set(cache_key, fallback, ttl) + logger.warning("东方财富A股实时行情获取失败,已切换腾讯兜底: %s", reason) + return fallback + + logger.error("A股实时行情双源获取失败: %s", reason) + await log_error( + "market_data", + f"A股实时行情双源获取失败: {reason}", + detail=f"primary=eastmoney, fallback=tencent, sort_by={sort_by}, page_size={page_size}", + ) + return [] + + +async def _get_a_share_realtime_ranking_from_tencent( + sort_by: str, + descending: bool, + page_size: int, +) -> list[dict]: + """东方财富失败时,用腾讯批量行情兜底全市场快照。""" + try: + from app.data.tushare_client import tushare_client + from app.data.tencent_client import get_realtime_quotes_batch + + stock_basic = tushare_client.get_stock_basic() + if stock_basic.empty: + return [] + + ts_codes = stock_basic["ts_code"].dropna().astype(str).tolist() + quotes = await get_realtime_quotes_batch(ts_codes) + if not quotes: + return [] + + rows = [] + for ts_code, quote in quotes.items(): + if quote.price <= 0: + continue + rows.append({ + "ts_code": ts_code, + "name": quote.name, + "price": quote.price, + "pct_chg": quote.pct_chg, + "amount": quote.amount, + "turnover_rate": quote.turnover_rate, + "pe": quote.pe, + "pb": quote.pb, + "total_mv": quote.total_mv, + "circ_mv": quote.circ_mv, + "main_net_inflow": 0, + "source": "tencent_fallback", + }) + + sort_key_map = { + "f3": "pct_chg", + "f6": "amount", + "f8": "turnover_rate", + "f20": "total_mv", + "f21": "circ_mv", + } + sort_key = sort_key_map.get(sort_by, "pct_chg") + rows.sort(key=lambda item: float(item.get(sort_key, 0) or 0), reverse=descending) + logger.info("腾讯兜底A股实时行情: 获取 %s 只", len(rows)) + return rows[:page_size] + except Exception as e: + logger.warning("腾讯兜底A股实时行情失败: %s", _describe_exception(e)) return [] diff --git a/backend/astock.db b/backend/astock.db index 4c1bde483dae91830596cc6f861c3384ef17704d..789aa797240c61515bded4547b4483e4b3d88340 100644 GIT binary patch delta 37353 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ઈuWdn3Ptqe%PaQ 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 M2kt#R+cxQc1BW>#wEzGB delta 6545 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