From f663435843a23de44a369d9e940c49d63c0b0d17 Mon Sep 17 00:00:00 2001 From: Lxy Date: Mon, 6 Jul 2026 20:47:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=8D=E7=9B=98?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/__pycache__/__init__.cpython-311.pyc | Bin 259 -> 153 bytes app/__pycache__/config.cpython-311.pyc | Bin 1591 -> 2473 bytes app/__pycache__/database.cpython-311.pyc | Bin 1365 -> 1259 bytes app/__pycache__/main.cpython-311.pyc | Bin 8272 -> 10831 bytes app/__pycache__/models.cpython-311.pyc | Bin 5725 -> 6742 bytes app/__pycache__/schemas.cpython-311.pyc | Bin 6430 -> 6324 bytes app/analysis_db.py | 41 +-- app/api/__pycache__/__init__.cpython-311.pyc | Bin 263 -> 157 bytes app/api/__pycache__/ai_config.cpython-311.pyc | Bin 8958 -> 7546 bytes app/api/__pycache__/config.cpython-311.pyc | Bin 14954 -> 12892 bytes app/api/__pycache__/data.cpython-311.pyc | Bin 12532 -> 12426 bytes .../futures_analysis.cpython-311.pyc | Bin 52373 -> 51716 bytes app/api/__pycache__/tasks.cpython-311.pyc | Bin 10483 -> 10377 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 268 -> 162 bytes .../__pycache__/cache.cpython-311.pyc | Bin 15795 -> 24617 bytes .../__pycache__/collector.cpython-311.pyc | Bin 3238 -> 3132 bytes .../__pycache__/scheduler.cpython-311.pyc | Bin 9869 -> 9763 bytes app/services/plan_generator.py | 235 +++++++++--------- data/futures_analysis.db | Bin 12406784 -> 12476416 bytes 19 files changed, 127 insertions(+), 149 deletions(-) diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index a2eb7f4f93153f73d6ab451910386ca338508f50..e36685fb03de251ac65239fd62e5e3abc9b8a735 100644 GIT binary patch delta 38 scmZo>n#st!oR^o20SNxMdt`}Cd4T0f?^JcZy=c0}*i2!4Se{kzBl{HLY$>9(( mq$>((iy0vbw`4MOD4ue4+Hfd}MaO{Iv2@T3&Xv#cwEqF+hdCht diff --git a/app/__pycache__/config.cpython-311.pyc b/app/__pycache__/config.cpython-311.pyc index bb4ef7d32f14cf49fc6716f5a28bf68117f936f1..284079ae5af0db42fbbb99bb00a944e722aa7c2c 100644 GIT binary patch literal 2473 zcmb_c&2JM&6rc5OvTLuswiCy85)wk7fRhj$rwOD&LHnFh z)M`h%g8(KVbv#5SKQw%Rx{Q=M9}-B4etm4yjom-jR?C}AL)UJXHltW1`iYy3Jb~DO zcoxh5uXtkT1`B{lW7>LxhbD9$^y{Nlm$n-6VsKuPSv1$ZS^mvi+Gen4MQdxkG=~s& z1Ii|HttdlQjy5)S(Q%-SvyF{Y>^jh<%aB*M=xW8MyTzWg%Ybr=9s{bUO>D2&+ln%r z(cQ+TPwYR?#$(9jkT}qaPkY;V9TX3@q70ez8oUm@alXDbUXO^w2YT%{cs(i}YsIGz z84z#1ahd@G;<$Li;A2oU@xXU-Z2;YF%d-c&&%Su{{MWCZe*WXrUw(S}vGa1dzD<+GXGjeN1x5bIHj$LUxJ*DZ+hS7Bf(TK6y&4Ot{1#nMc-ja3#dm~L4c-w5z+#gYu^{btMfg@;tV zP~-~2Q}r`Ao5gROTjns({CBlIJZewmQVd-j+?j<%J{4RHM|rs$0p%V{Jec%i(vJzg zrt%;rLzoO>aukv8!7D_;>k;XlrH}IRtzsdQm6i(qG zoHQ%XAXD7);>YNj-y;cv*fW_3Y7b!22?&c~#z)z+^D2CJ${-ZF2QzA z^J?Xj?GIGjgl3yiEH#^>%vX9VUH5yp&h5BWr(bjWn@W}|PwI8t>f7d3yHB(GR9xv1 zg{e9FuvN8xbSJ5sDO}CvX=Gm=p4weky+O?zR9zv>71GoHuNk28=ow#DZDX2k3}xId XZc|o0HLE($YtHiuho^i7UBbTry&gos delta 580 zcmZ{hO;5rw7{|9UHed_{RE*+VhygB0Ja`}`o=m)W@?b)0nz9yo8FcApOt^UR1CaUw zJYk4O4}J|2Z+s1Ip6o_Q%rc+!N!#cDdtRE(3Sa5WyJ@B*VIOv)4`Y+ej&iO{s-?_AxT){Rr&NV6)NYq zND>_<0wyV#qh`wpK`CrZ6*0WFhf)tn|vMi0RrfG)tKgC1=U zxLw2u#K=RyVYE*y4-63-5HE;9i`pVY8FXyqbtoJ1rB*Xe!~p*PyCa!b^!lf#U&zK> KDvHI*BK`{tt9V@i diff --git a/app/__pycache__/database.cpython-311.pyc b/app/__pycache__/database.cpython-311.pyc index caaca94fbc27a51c67dbf1a5eb828ddc662bd4e6..d036706bf36c70224bf80fd425a3457dc84c917e 100644 GIT binary patch delta 41 vcmcc0^_r7+IWI340}%Xi_sE*Mk@o--uTH8}OnH7$c5y*sa_VLmW{s5mtyv7jIZq#!dd9ZZ827RRKdrX`lkqhY)N-nt~y1NkW2XH;ZRt51!pMcV^?5 z?rKRxghfFRhDJ_OQaftFD#0bOD)pTzs6Qg2WEQQI)k=~0(KXONbz4 z`Z0*r98iyN_uOH_bw=}Y&72KyXELmo#ey|vOX~n*OzYt=7?B30G|NX%>*LN=BsG>Z zBD4w-eJSQ86xWTR*R(I8F-DEmR>c|~8N1rBG&lvrCz*6j%AlTcs)jVAFbT^4!L6%J z%LQUkd>i#ii;U2eL*A%ywIbI15H_$3S4(jnh_zJXpm1Fkd1J~r<)rv-l+vdRmtg{~ zs*^wmW)N`5rVOut2|`*0S4@*O#oTFg%#*f&&m>RbP-DuFG9UGpd8RCj*F%~QZSu#a z?u@;f2&8iezL-C4W$0{Jmy-hBwQQ|W6RS(xRKE>~En7b-!YKq|!L(gP*jLEl0>bra z2lz`&oxs$wgdJ02H|Sm=w?}A*HKuFT+_fv@_6kk0P}-^T@CnVamb6R7I+tV9ZX-&$ zrdp}MK9qWBq?CJV74^vxb1jb7wF0DK*zWRI6O;DJ^`?d`b;6q1+O$U$BVl>caZW!n5lJLI36o_L}jtes`+dx&j-`;H~| zjhFP*tj_F$A{TkDP)L(>sGI^JNE(t3%d_St#wdSb?r=3%CzK*kW>9ZDfWj?ur{!eE z#K(ClLO7Ne!%U%c7aJFk32^5c;-rWuB}jCLi^QUFIFbFyAdFYMHd*|^%>2xB@ptEX zLf@g$p^nhL@dMu;NUna!ui8UxCD@;Tb+&l!7k4hsgp=I}WvWs^0$$?E*y4pVrKF+a zrBjQ6VJ)%1AO+LDC>i0TT~R4oupbzY9Z3k!@i9)6qOsAihR|0|!5~GC2%MOtLf@S} zGyle$^FO*ie|Gjk-pt+UnLEFg=ifhBoVZlH^26epw~Mo9<|ocW`MwxGM4}QG0X2YB zL`p;|%BZS=BEq=HixqRI98vK+9BS+x9qmuVU*U(6Z3yi~_uf2v=l8Qf;{l`pLC9ZD zKd8ow6-M$k%dE9+chBLm1Q`)Wql27$%lb4U%5}C(UD8P>C}EXaE#DsrTmI$YFIwI)al^%!@* zHpq=id?H?`8H{imq|gx9wC%G>7sX5E>71w3u1~R zB7r9iiFMG09`z%eX&4sxS2$QWaYElF^a&R~f^UGk@OJ|J6C=I()Lz-?7|(Pnx{jqS zuUn@qZ+YD|WqG^p@|_sS({4eh)z{~J&F7E5mAaUkuuNF)e{FUzAVy!m*yVje>Y1=C zXu*E}{{00*B`WiOg&{}%)MmxL_QW%Jd+@>4?Hc<6((4D9^UsvdUt`-j^J%l<-k8Ok za(I)Xw!E=+0cin7-L}&<#kV7ipUP$MQ;OP(V78pLD4so8yf=sUDtPaL0r}b$Z#e7i z$ay5F4=C==Jl?N7y4}Xk91ebk*WAKu zW(NM)p6h!dqr5njd-0gkOBB2&i^Uuk6)aXt=*{B39PU$a-);Q3vb^PSlY*PFxH*TL z72FJLjgKjK+tQZDK?MgV2eLSv!(j!7DQJL!+R80MukyG}!EIUGp2O`5Zl@psQ(L9w zms1bt`kq&MUr;$8%;AFyK3L(b>Z)o=6ZOGpy-QmjhZG#j;+7n4Q83docgk^{>3ZFH<@IS>68;Tk38ahnK?A~xwDH2ZGe5YuiJueQ{cjbV)joB*qyQkNW zP*fG(K@tM&6r8{fN~Ne{fSQKmAF|7{8X_O}Om?mmS(D^T0rW$2hNe!?Zmaxn&mSDs z0rE|6P(KF#U(0rn=Yr1-i9NobgsX9YDA=NW@JamU`T>o^Y@7 z+}OHNAsUx^JwxA9H;bR1z4PAW-P!5l#D#m)zr1(pgX4}8E<$l#!%|EjD~-4mRjTRx zFv_3cAcS^X5zDoDfR1i)^}=lubw>#Bcv9S`@g6>F0OK1c}tAE;V* z9Z4i4auPgQd1qZC#6{{hG5zv|x_6m9^1471vt8a7_!hHYen0TE;W3)wko=dx=1dGO z3;Ngy%M&;ylCbp&)TD*49(BqIok2oprC{UZgF=$!A|#QNI8rc_&VO>7%Q6y90?#$=t?jvZ_#u@fh19H*|`LJ?_FrA>)Yg_;0W5oOC}?H$`2uXnB4 zU1%kT2+>Fg5K@^-_-{D`q!v`2e1JadqQf)rj`yu8SBcyav< z!`M)c;TRrPhVK;U8{Rl7wzs`^5ub3k&->?5g6CTN4zO-JTxK@heO$|RQ=mmYGR(Ey zI|#h+bq50EW{~;liV*Va@yw&Ze8k^Nw^H;oVf4v9ZLksA@E}fcDFH3qh-`QfclhDT zW7nC-({j^&AvNl2`Oa}ymNxu=d0YPVp@URl9i_9uQ>Xf26+1vb<`jW>9@z&!_4H=- z-Z?1pe+wC~@&_R}4uTF^1zH$Lp%7gi$VI}v0j(2IX3`USk;_KtHv`w{-=W)^A3QTB zDn_}EiS)Wb>Sj|eW3g?5V;z?*u_2Q>wj4|<8yY|ck(!!pRSeP)OLnCKXVQD&)97jXS9mjV!45+;dvAX7 z+t*+Ge)p}t?{@Y+{3@T%XA|`O$V$8)GRU(7O0tPb8mMH1nQ{8d&>Whe@#qN3(38>P zT3^?ZVqS+g4yz8Yl*j~wGHfScT`p-@ku2G)n`9a=vky%AV2~`M`8BnIp;VnLz&6QP zMV?-Yz1@B_eg}=j0r+7$x)kQ_hht0At{-R4B$t!igJf*ENY5v)qJ{STWFDobfJbu7 zI8g(dQB`%RDOWLh9?&%!8l6TtIyZXj*agPw;SUmMpJZaz!>;Ngu&VHxG%z*=%EH+8 z>|siut#$>MfUL97FEEp%e~x`$I7|?&*p^MODapF5T{Bg)D}NbOoAlRI7S8HVf1W)| z8kAMIXT73UyP8)(vqg8)OtU*)8+VH8smxo$vS!uD8gSpGS0)m`y*g1l`W)=DsN=GU zmPLd;D!n~%6T`5G0-hUG$c%w*Hgg=ErBdc2bb>z2q)?G2CRfo@v_84)J<1|1(0h|l zY_7tx<7w0tmB3`!xxJxedaaOIX7?K~*nnwt^*M*cK)oZ+9lF9fZ~AB<^I< z@!7AbWrOG)7qRu8Y#;jP8-`+Q_%sP@fs8#>=B@U%sdv!i42o|1_BojTGk>@^KDvvB V_IU4% zEU7i3wrQI|!BkC}7^DFav(=auW1>di>NXNXCh^5&L0*)m_~L`{|IfhI0#818cF(ux zobNxk@BIJ2zf}HQTgsa{X_M5Al_oX}BO>UNvS=ko%batRG~p7f`0+rnZLPOmZOY6vxjeIpAH~b z3{X#200wP@-jCBdV`ntwUw0@&!&Lx(;-+wksY|2NpWV)V_%>Os&p5WR>-1I5IA4K_ zScs@!b{2=WKu2W(MDrkcva=;ex;vT^@uRU0MNLIJl2veIB}pWyQvb;rOyl7qL4kze zmsBHcL)eb61Hp#CA=Dt)5kv$kjssih9%L87egMNmlvbjsr=*sI)|sOEkUhvgkf;v3 z2<&?Ooa=j2qPom8?jJ0h7D+_bqHSIdvJbnfGc~@ItcyPWUK}XZkNNjLmUo7rmFi00 z+~5WR)C*vl|Y2kW_b4F?gbNN-20Mg6>NqNV{UH)EeuIsizd#;Mx<-QcQ0Q zY+!fki9q>=N6`)+da=Y$;TS@7CKH%r%c=O-Z-JUG1@o=@zcTtow!vzZIsH0c#w$*l zlN}>Y-RCJzyCD&H+Pw>tWY>s$5Zq!Is#!2CD0XF$-9vLcBi=#qoniDJTAKW_?*h{# z$bN`@!Eo$PCZ9}nw#M2t6h3#WZ@O=2=JiX{UyY`JyFMgt6?2~qEQqFr&h7 zMw3bKHJp2tQ15Ag73#IsfTrP0-{>FX7juK>Mf15;F(gJ~5PZ~ksMqAPhvv&q%k_*` zz;@|KkUF7;k(lefmb-mxs{f0b{+k4MprcdQZce>BW{%Fsw3%DvPjhL1WMDw$}1}-d2cV*OWt%|bPm)EZ5m5W`m1K` z)&O^p0hmMR3D5FOQQ4K+fsI4O+1(ANHO d!>-LT`iX5rH|}(+3zbabA8=t<7#FU*=e9zG#Ep~on{&SJ%*;98J)cj09gv^L z;}L;f(+`y5qP!`m(9_M{*%c%h$OxFRa(pR{1fOtTFoF*SL&WhdzaYF~|N6Bgb1lTQ z@BuBsHHm4F16tCEUK290&F`0xL?_YJ+GBLlmpIJc>V*tk&|T9ZDf-QSRs@cP!-2je z5060JQYVXnHj(Ekx*m8fb^_Z?XM}iNp*y--B~}sV9kr~J5_UMJv@7SXDv?i4Ii zR&#Elz`jYH;3#URFN5n*-c(nkGjU`vcCnzaB6 zhzKwO5Cqs8T7nezg^U55X5hvDd@66b6^GAFCP3XAeF{>5PC6caSD$>U7Kpv~9o;uM zNkeIUN{D6v+G{&<3ySiEnFb<7o02nAy9<=@bGryEj~BKoZk3%e-fP>F-8FVNc1g4E zm2;L!dg!C%?JzgZPdcfjbSei;no!!&9KEiLG)zkGn$-7Cle|zBlU2*G$s+xzbfC+0 zN0~%pw7;plXB@hR&DihIIp6>WYgW?_By;Z|hr=17bEz{6UW~1G7PdF1+nB`R3BFU@ zUH*c diff --git a/app/__pycache__/schemas.cpython-311.pyc b/app/__pycache__/schemas.cpython-311.pyc index 7cafdde1dd317392a05c2a139f7ae4a2da0a9481..44e880f44957b10aa3570f23850b1dbee248103b 100644 GIT binary patch delta 41 vcmbPdw8fBjIWI340}%Xi_sCkZk@pQVuePgIOnH7$c5y*sa_Z&+mUSWk3Dgar delta 155 zcmdmDIM0Z8IWI340}zP0aAsL;PJGCgjJijQrxF9h(H6}SfDZj)> z&mcY=DCCh}RGb=~w rVsaCUvQtaIV)4oOIY6QOqWFTG#FDi9qTHCI(zG<7otybsmWcoW?h!hC diff --git a/app/analysis_db.py b/app/analysis_db.py index c115945..c8a04fa 100644 --- a/app/analysis_db.py +++ b/app/analysis_db.py @@ -7,9 +7,6 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base from datetime import datetime -from app.mysql_database import MySQLSessionLocal -from app.storage_manager import get_storage_manager - logger = logging.getLogger(__name__) # 数据目录 @@ -31,38 +28,14 @@ AnalysisBase = declarative_base() def get_analysis_db(): """获取期货智析数据库会话。 - 根据 MySQL 可用性动态选择后端: - - MySQL 可用时返回 MySQL Session - - MySQL 不可用时返回 SQLite Session(兜底) + 分析数据量较小(复盘计划、评分等),始终使用 SQLite 以保证稳定性。 + AnalysisBase 绑定的是 analysis_engine (SQLite),ORM 模型均基于此定义。 """ - storage = get_storage_manager() - - if MySQLSessionLocal is not None and storage.check_mysql(): - db = None - try: - db = MySQLSessionLocal() - yield db - except Exception as e: - logger.warning(f"创建 MySQL analysis session 失败,降级到 SQLite: {e}") - if db is not None: - try: - db.close() - except Exception: - pass - db = AnalysisSessionLocal() - yield db - finally: - if db is not None: - try: - db.close() - except Exception: - pass - else: - db = AnalysisSessionLocal() - try: - yield db - finally: - db.close() + db = AnalysisSessionLocal() + try: + yield db + finally: + db.close() def init_analysis_db(): diff --git a/app/api/__pycache__/__init__.cpython-311.pyc b/app/api/__pycache__/__init__.cpython-311.pyc index 281e2fe693121e4a2fb0553b6446f01c88842863..62c73099a3900cd270bfeb218c572c571b7c4a42 100644 GIT binary patch delta 38 scmZo?n#;($oR^o20SNxMdt|Xson#TO*!Q;XI%wG%j zRcbve+k{oOoYdj@J{`fb@g(}e;!{LJV7TSH-|qCKsD>pGV2tn&?!&dRh6yY=97Be5 kLm_Q3BShhjOokrCQ?5=M4n?u(7%)4Q9@^2l@;RNGAGc6A&j0`b diff --git a/app/api/__pycache__/ai_config.cpython-311.pyc b/app/api/__pycache__/ai_config.cpython-311.pyc index f17a40c1aaf92ae393f13b480f6c032870597ddf..5d63489669b8ab59b7a55c3bf468f63cb50cb535 100644 GIT binary patch delta 1774 zcmZuyT})e596#sY-j5dg3FV_@(2l`u5VnChm>W_CS;~B4y6uLfX}FiB*wT7>5ochK ziHRA}h(`m7Y+|BF+?)^19?Vq4_~3&NW5JA6P5c7k#nhPiV50GVZW)e`Q_k=F&;RS3 z^Z&T~+x7Pe+Xq&w1;IFfBsB1id&*We_B%#s8mUM@Dpt8TRxqr5oJ;Tuj~UMtHzfo` zNQjDc-Xq2q`6?U&{24?Wgb7T;R84!nDh(Y}=}IpHs>- z2UwNwu_}LXw}5A7gjDaIdwEo@2L&qVEZ0dlxF?DOIO~XNdblq+*dL3A(|VFqIWn+o=vABeOjhhn829N{3N~z3+RIDR(bfDR6!MIAt|#w z93v08Kp`0NZNB{KZ=c=Tyfd?L>%Fz{PpP?JW{gyUEDt_L`2n)7u&VV(hT?iS65F~H zX$3(5X1Wnz9OXn*1ax(Ie# z;}9aPqga<8>=Bw1m?N)g1iy{0aXT{t^)2XDx@7nI#aXV8yNFb26koigrIU5%AZ=267H-}c5L(9(Y6=yfS<48Z=*oeVs zH3@*^GN}*3zU1-;zASrIWY2xM=AK+Lr!JgbmRnZjmb-Eb z?Ji3A4uIyBQ{a3FSvq)r$ND*GvLs}WMdOoQ}~Do+i0gwgC1kmW&vumUFv0~S`o z?n)9g>^pGyc_3Mtrp@qQAje~ja~y|FImAFj*gkG!Kl-`vv=i0e-TC*1|3hyf7H2wh N2$tPYNvjWj_aBwSq}~7k delta 3163 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 KB@SovjsI_H&}lRP delta 7361 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 diff --git a/app/api/__pycache__/data.cpython-311.pyc b/app/api/__pycache__/data.cpython-311.pyc index 5d3f8c9360a05f5c19130d753926ec981daac6c0..af85d310453a6222180f27e78ed75b78ead224bf 100644 GIT binary patch delta 42 wcmey8*pQqvMkb4p^0GZKqZ<5Ln#5@QOA^0QKt rOJZ^pi?UNoz+&;q`8hzL{G#}RoWzo}{G!~Lq|&rBpq-m_c;l1-TNyhR diff --git a/app/api/__pycache__/futures_analysis.cpython-311.pyc b/app/api/__pycache__/futures_analysis.cpython-311.pyc index 7dd0b8af94f663243663d22a0f9eb2295f315ea3..d52cabed5c4eedbd31c944f573805da36482d6c9 100644 GIT binary patch delta 8796 zcma)B3wRV&mhP&q?sU?G1jrK_(n)}%fxI9P1p*0=ghz;kr#6qK=&DW{`juPVgv62H zh%?~oC|*HDR>u((Wn`4{G5R^opg23b!@8*Bu3Nj`y5Bgk;@fX#)=~HS+;dKKr}OfW zFF91*d+xdC{O5IVapZpMfqSfDAIr|pvcS*gnw7h*J9Kz#k@y$K;mV3KF=X@F6hV~n#v3nhKsyK;bL!b zc%pYAjb()nzdBFIIQ)M_xk`>&9uSq>1Cn>DTK3avTz2Iz9rvhUv7ClK^GCF(4t4C% zv4EhASI5B02?uPC0^8{nv&B0-C5K-O=Unp*i}TeA5+ErBBLq~Y1oRgU-Bc+WRhp=v zwBn>hyE1WvL=SP~s1*T8nFOZJP+aOvWitFtfj=B~C?zmHi}>6i3CHaHN+}FhDP?Lk z;Up>L@LrRAuLWUK;k|Cq`!sl;txO00Vzn05R0r%z1&qxZB%>1E>j%Ai;C=3(_Zjd$ z&wNMcNXkqYXh>nQX4WuFstA+Zp`+j!#H1ROr~x4P85`JOPX< zCs~p*dxWg{Ded^bTgTTq)Zy9)v{F>+N32|s(gIh`9c^WL-?<}JFND>NWW&7gWdmY@ zct}da2w95;Y`7|Yn+?~FSh;w>23YwWHq0Nfx(QY{qYbMUd@maof=^SJ*pFyrWf}QM1I%IyAhUvhKPOYOhV{qYm3cY5v~3 zSP9m(Y6n4#J2{k&5j(9*?X+gyP-~R+-=aHK3{&?FBP6a*NnE*csKim_3CgCVEJ@is zLe>UFTyODQ&ktrc>i?YS5b`{Nk=v=peg0@95bX46@hDUITUk}S#OZRhL3g>=5*PS+ zR}sG%Y8a`TVUtQMOx)$$phvvzK1uhT%f^)20L2Z@KK8^tyBMADol_ z%~|<|v+`8&Z^YlNyHvjxeqVQX{K46AN$OxzfK|^K`>0K*;?GT}<&L}tyCFqmYD8a_ zH%kx}@$URep@bjHpCh#M*YcZ0HihRF)RnklAzKQ>um$64SYx^PY*+Wj)ri8D@Erw# zF{LzQg2ex&phT$QpA-}e6+E+07V7x!!U|UjvJjR@!+oKk7H299yYw@Kl~NIE*q2+Q zsBt+Ms=3jG>LymLe>~{}yS)Nt*>wI+Sz)*mA7>yzh?xh;OeC|AR3TZ2WHyp{NE(n- zBdI}Bi=+<893=Hf<^nNtwM1v9s>OrR$U0Tlq7eqLH0E(fzB-vTAzL$&Wk59C+wEp( z7i;BTl+O?za(@wFzgveSTQ@YAcCwN$#qDUAn8D|4#`HodRmRJiQhPF z_RjS%;3+iKMPS($BxL_qeAY zJtIQaS?gLu!hu#k-^kh2y%+8#XYPLjfOQC ziF>k4>0>qZ!PG#UFc-9;0{7txBwt$i?8a+NiQDz=#@odHl{ohSk`Ixr0Mc$I zD>;c0cpx#scFK$Uk(Kg-G;mUk8`&|H1*1x`0vmQHnTb%GlEAR~1D)w@aL%tr;)av= zH5E<8@YkF`(mqK-feFTtNcwY4Z7IjNmOLRWdLKrwQr*Cix+)+isf<;{V`HeJVPkTn zQ%$SNj+>L)xwNdNkes&x7b2MnBD7z^1Fzkd$G0y#DNNC&<-Zby&-u$OeJ+ws(c6qG zh7=Zled|1-iQn1UU}8I)Uu+Fj{SElqQx0E_i@pM4*!`iXrlwr9KUJ1|D?Gw-erUy# zesVZ2HVY)~>9LbNY!i-tfdmbKl$7_fyK&xTmYF}}s3Q>rA0z-?o92fu$RxDP22+S{ zleytWcx6cDr_BBvw5N=$gAIJu%BM{;rs=|}`-H6oGU@|yOP(Ll0=C84lytEgmW`}1 zxI7pO1yx4Y4s2^W)X4Pt<&fV8tjq};ujYSU{Vd>oy6tUI3V|s8`Zo*)C8&dmCl(gZ z7!yT_Z|!i2Us-rxN7b}k#Agi5B6z7E6T^O#hGdI=vE#N>bjH@-EZRT9sn7Z68-L;w zzRj42H&}LWxPVcG{~Vv_I7Z37kXQI?J%kp87M2*ZbS6u^tt;5s zr5O_7r7?-`_vg>61Dg#i)Aks`ZkC5AQ09zU)_;idket(h?{CBq%2eIL`}z!ZhggD# zKOsQIvIo9DiRxatspyz`n3O(-83Su<{%8PuYIC=1K+!JIg~1R0kiS%w5| zpq9r|wSo<+6%Acg!uwq9>g^z4%3-}H)39|XRMyMT4#OS@hT>4!NJU4KDJt{r>@{_e z6jk%Hg|LBPl|!M_F#!iyBd-Y-xUtzNvyJ>K=X@+!@)RkUyW5}KLFeS6!nlsKBc=TiIFDnQPUv7SplGC z3P}Az-_(6px<2iGyd)S>BpO$ZEI%B6;;Q14<4_@ovan86sS8O95V*pb?Lr$C0z3B1 z65RZbJ-$Wh5U{hAxDHzYTRkAA4WHJSvKsNZ80H70@#>yp+b$TM$lH2)z^NB{eB!m} z)Rx3}pzr${{zE!`XpJH232;F&5S7@~q0_FhU+E?6v0}QuAi^3z< zAeC0(ItoZzAjsf!yA=nvAt4O50p1jRUmGq3(qs3`RPQtccp_aj#2*LwyLu5t1_?GFyRvx%zZw>}Qi(wC|N-z;-@AHptxwSumLZ~)4O)q5Q zs!;-ijl~JXz_9LCdkF(dM({1!`6HZiXlfkMPn`#o=cH^Z6G2}%3ZQB15U_SY8_?e2 zpB;D?;_0nhb8X{Em4h$^@%&@>2VnaAwvv8~B*R848KMG7mw+-8Hqki>S{WH~Ea*d} zhGNwjpr0#?3AEs)43Ig1T#F}@#F=95#Qlb@P9jYmV;?{EcN3E#n>#3E2QV=e#<(C% z21PC5iLNs2i5T7{zcY>z0yudhROWT>4ixJb;37UWhJh{HtSw1o+1E7FaEZQ+* z{8s){Tb};aPY#K8O2~cuw!^M|3Te`dLYnf5RKE*1qOfWwSi59Rj>F|N1H6h4qsDrM z8JuR-Ljk0&=|Fs?&25Gp+V}aNQQ(eZ;ly8+GkQ zo^41*lerc0Vk9mVa^NZ9(I29Bmek^1OT9f>)n=??usWR(+mv zY>_aXw;Y?}Ot*nY_<>_>!ZH5(vBDc3z|FD#vK>GSDHwsKJpr?XY8nLVn4&t&+v&5vcVHoCkXrI2TE=DN%1wk^MT!1h~9i~S|twPjW`5%Vl`DzNgN7E zUy-@{p%UAZ!2FTE?4c^rehMDh7QN@;kT~n_;W>exzw+cGmye&ieDL`zN1t-{iS9}| zrGF{Zd?|R$hW8N9IWg5qH;l(o!u@>FiIN&rg6^dr$#8_CaQpEoJLwp18bxg*iS>T4 zl_?fN$?XW(hWM9eO1D*bB3Kdz6NJ`DA93Q+f7$BxS*Xu z?#;-3J(B0~l{QV`*F={YqmZcqxUqNn;P67Vou7HkVSfqOzY_UNkHIaCvs1pcRQUw< z42r=PPhTrd3G@LfB}IeyPiX8M@VTvkHad5|Gz&F31>G#Mdre3SO0Nff>MSj#Xi-HAqs7b zE|QRHc@#dSAdUSRmpD>O21V15UI#omED^y}OC8nNtFW>XE%^(`K}#m+$4~#0tvaoG z3&a>{hnbCMQn>44r!-YLk4nAF?|FK6ZWBI|PR;oA8P7R8%S;)n3BThlX9M|Y9OVf+ ziBGQ}S<26!t?d6td`!z2XlR2D&GgZWus|S97#!x7zr}&l6c+3PzG6N=kfF9_ZVkHb zxJ~EgBpZ?(8Dk#I*=w+}S&!>;toDy#eX?|(f39C_PAf+SUIb2v#PsNZ$_%GiE0AG5 z_~sXCg@^dr7rf?|h;lyu#pV4k17Eu*+ibfzXhQmgF{}YEM7e8_j200#6AEI&h+yqV zhF28?rEtJ(IW(T`BdH_%8?c1y@4e`^jzPUPu-8#WIp2J)Ri+x8R*(#*enCzjX8mXi zO6*OPM!Jo99Qyj4%k~zqoYCFCUM2KzG%|cXCF=M23~3j905mc}(augh)Y;>`G5D83 z)+cje)fj z$|=J-XXM}zWJs2IRfEEob@%z=e7q}}=Vj`dWAQbISD!C((r4Xq_&%O@oOcyq@i%f& z%8>uI37wzRzXPm;?}X6=8~_aXV&RXcYaaby1VuG{;bsq`#G8;TL9!0XJ|r(7itF(S zKa9|4KKkfIAD`&c4SmU=dpuo8=_Y1KvFHLgN#l)!?LvZwTt*EP&!BW1qoadijV0m? z8!^KM$&Mj;fQMh6ViqT<4gSN(tlCsDPvAVY1nf8LB_!vNV0AI1ozZBB@`_<}F?8^- zBKxIdA)Ip(A$1Y^5N6@mq6NVhpIQY$_*4`H=~D|5JI{J0kJr9(Y5d!ks!KzE@4nzE a`_wK9>xBCh=5(tDqB>Y;2w$fFdH1v;G)j$GHgTnY3 zQ1Kz6;s~rDjvvr={4B`I*&S!pqk_w>T6;J;Y7k~-4>)>eJd88$y|=p4`HjOi^v$dL z?z`{)?|aod_n97k)HL|%^z<|Xd@g>Hw|?W#_6{yEu667!A6sG$Sb|o!RWL|`WDMBc zHu!4^*n68c7+QPJ_WcMjj(&(rB!d zC71h*Qua=>+a;GA8poT5=FQ9L%^J2#lQVnce1eoK4~CU_J1xgx%V(3@8rX*j4lK^h@f zOC#Z13}3|CrBQ&NNOUE@331k#R0_x%sZ5?kb}~z&;dyf6c?vKa1J6@?JdcIvX;L}R z50j_Bnn^yZ<+R!?P42gPc2b^sQ+n?_pfm#U zF-lYW@tKp9V!@5^Ny#*=AFo>AHJ3EHXdYN2vX&#UY(tN4zpjlih)w`Er>L*gN9D;KJ1bB1O zY}{eHfvVBaPo7(o3@R7(ww1J49t8Q&xYOLHP%VcQRPgv;ZJGH^I}Ls2Tap|-OM7!1 zs0s}j_j(qhvdbt7oBK(LPomM4xTGG;68)?Ol z$c`06mwjbFj;oU#8&>t^I3PbkTAko!me%y+wMH^7H@Muq*l~-+yi8Qv<8Fsj;2mj| zH+jP$pTDg$N9hQ*h69R6f38}ughQH@$!e5^yxrXg23Gi*;QP&Q4SeY1lV>Rwzrhbp z_#o_{T2hp1YG{y*lIc0~FD!yN|I#wYH~<(~}C9O^Yn7W{Y22t@GJKZ0So zfoC2b5|b<-zcpF_=&t(?U4G+@F23Wdr}tdhwdbohUbwXX?k`Wh;xcMBUlin(70sfk zVebY_V4aqz>Z_dY5;VIU@`fdUsIAFm(Q=lrSu%HN<8sfurA_q>3q17=jdhw;-r`qO zMKgyZa!50i105KQa5w01k7dT*&JpYl!)k+*LuUPVYQ~J+OrB! z3&Tv2*NTzIS|orS=`Rr~YbDtyMg!_vrCnsQM-o+WZG?r_%U*SDP-Giqm2lvN0HDIm z6A6f_FKlE%t~%$%@c1zlz6$2jc0-qQ#7EB2A38^$caFW_9DB_mSSmgqHvG8pT*i3( zZy$frk^WzUM;)4UGXI=o#(Bq#3yv8`RrFf(#f+TY9S5@R-L`w%H4|V6odRDY)wc*z zxND30Jmcec-+kAEVgLdq3uJvIw>IB&Hs4%3%yxE!05E>ldCVd#<@>X$ORk>2=gU*~ z4-kNtPn_y{VE@(A_wu*0rde1qFp8V9D+FOKug)nK%J`a`NkR+XlQYNoje&oVGjSvu zh%Er1S^TOTR2XiKo>k?L#OnFTT%ThM(&Pi+dviw$llY6dg+c{?H&+y<@XEZgMP;}o zvkhF42q#Yf;)3}BT@sJvm75D1Vc3~DL6TL`ADFOJm;4S^6F*t_2dlLLX4!atxHx}h zB@U|)U`Ue!Yyys|5llod2f|92uO=|7-_~xL^HC9 z@U78|3j9@S*mQorv}Eu&m{!m=#rWa1c{wA<8`(X*p_`rE4`ji3O<9S#i2RW;VMD+l zl2h(j1_VruN6No2#g^ij5Y0Hc6@X@*IC*k4+lNC_&>v!$SZq9k4G01_Ar!M9K7{bW z4(TeZ{-CUx2^y|s0=h{PT6E8nkICEBxP}}(7e*~CMy9vx2FH*j`)j5E6dD_oA<4Zm zTLE~@1d*nh{2|qqrdyjVize67A~N%bB~MU{Xb!2>qdzk81e#t;BLh$YVT%x9M=?FX zah!s8C^9MmiV$ruTD8ZTqd@aYd~4ymxO3#OE1P^|3$G(+%7eDRdejhW~WJ?@Kf)Xs02{(vx*zc+o!_-70*Q_m@wSFkC7 zTzcG6>>>CQUpS-DNvtsLy~c;Uxja7OE9WJ6V!ualnID~5Tth;cbfJ(EO)5hFQhGDK z6IUQG2>dTIXIP1ID=E74rj5o}6V6{l@HK)Z0Gjl?C7)6*cjqV=ffDBlB&|n4QaC9I zwDg3l^k#~ERDq&TS)!S|zP8jhIOml^s^;XgXBCuTekgE>L~|rRx>+y-8G^L<)>(~7 z5B+ZTFNIlG0egjNh7m^sQj*A6U|bf4GHMnkhT7zmsO*qF*~;IpouGSh4PY38iQG2# zEZN5^@Xy+E-5tzX5R*`vXAm zd;_jDfQXva8we|M(ns49MGK}o%Xn2?k)urx$y*|9)?(gNKQ~6sLQZQY4=Ry84F(2bs86cYrz4blqxpL13IC7Q&PaTSjL#hcQoXcp{m{6=n<|tJYF&2 z^~lihGhw=!|7*jqgvNMe(Z@z}1eWp#=ZA(fD@+YwV`OdPyPHY{AOGu;X^^Rtnrl(?rnjrP+13EF|C!0zrnXWjHMJ2!3R9-}qqYS$JumZUT=~i>_QA>-AkSep6R*ud? zEe63X8Y}tHZFU!OLmsZqOdpwk1jna$>W-( zP4tHp%?hyx!KX)}S@QdQeD;dG%1$7MwxqDpsPKS!xDz)(aBqCaiZ;x{$fClyan-|u z@C`q(dW1O_mZAqse$<0N)H#A*U6aQ>YaGs#DDYSWja*sNsEG$rpumiD{O*IMq-}>sb&d;H_J@3d83R$6=LXU zRs%q>!*s&aiR{>gyb(Mb|D)T9n(wX4<#ReM@vOBMg<(T+X%2u+=i-^gm6gTw5wfH? z%3MahBa&b1kk>*0eL{7wr$l(0pIN6D5dUBJ?)eN?QbYZxE8pQSd#0GNRNO!c;a2bR z$8VoDlxho=_wP|Gj5*zgbNC-`ua1!oDWtHf=yfwu=Pm92wsyENfE5)zzHEq*6%`|F zGyG*!!6KT8DVsE511m%uQ8En}TR%ho2>t`;l*s^~{KOv@YtY#5w-yUm<5yd6H;%+w zuceD2G0>s-6%TfK{b;xw8SLR9dHTva+=`k)J&ZJmUkUrdEGViyDUo~u5-vp0fB;@K z7@pB92`hs6J`TDrR|?m7xvxX7$aJo8XqJspnRPI%5SrEJ52!Muy)}E7NpMqY?O-H@ zS&|hmtA#BzlNbmjPZEe=a}f)j8>+LUC}v=V;YUSA%f*vQx4!Lg91q)JzvZx`izO`3x#e$OT`0E%E0U}Y$d6RyO8 zB=J^2!x>9jpG0g!x;=;;q(r@5S>acLL&x2Lh`~xU5(zWa6OcE_0fqe(k;zkm3aKV3 zY&)+EjmmK0j4cR_P=xke$A1zU<3b!;2Lk9_GmQ*O2MjQqBth#82ZMeUsGkd!r#}hQ zU`c8^bNTN=1#mIC9vW(C2L?aH3&Ss&SEqsjZxxz36jo&|%?rmQRhB%W3MI5R3EP0X z2M{a<02zplTN9K%;ZUkp2xIs%)ialph{D0jmf*T{RAOm2n`Jm^)_Li!PF(o9Ir9Hi z3oT)wDCW-SX8rhK2>?c6b1icMUX+7j?!gWZiS$uv5>3TaNL_oDpYu9)!Pm>Pf)5rSsnjiOO;9R@V{>@T9Gnc zw`go55NTFP4#<#KBJSNsti*vF&B}ZTNPtud@$j}`md!9xAAexm8Iw@Qo3`J!0=)~p zk@Vb#tL{MXQv@*t+Y#(Qa3_Mh5cH3TV7LF!vNrzr?PG*iK6=NN42+0+%^H*?e>BLh z^5=H!igh9riV~;pg~7OLfGA-ZIDt0MOdI45vH|5J_?GniIZoLXSyjRM$x~#aT%=RE z@Oy$`Fq*>d2hvs0Jd{uQ$veM*TCwl0OiMP2vInLhxOc-JR>ohsXJiZ`Nwd&OhE{=O zi$b{x>ehJ-q|$6+#P30&dfTeaN1scx$!Pv_HsIN9xq6p_*y(Kc;eNeWCoD~tM^i_$ zV5{1OOUDm){o>~k=wJTZ6J5_AV0s*9_K4$dL+M&zu#lm8gfbZ!nQGQ(1TV4wIJm3y zLd?)GS{j)_zfeAeeES797w*fkJOWc4@xuG=HVU!$;oV1!R!Yaac*6rlF$!oBfC8GL zjbwZn8B$Q;MM|@^i;Aei<<|y2#le7)Zqq|kuXV_P#M0f@Eg%@)0BMIGHmnSpXXt8s z#6(Q6gFyUL{D%j|o2-xGIuEbrKO*ZUq!AIcBJd(elwEQdMP$lCsm!Cz^~_Ce{tH-s z3ghtunBH!yp&<7jdUTZKS(v>LAM@x2tY{A% z99@nG?CSxzlgr7Wa=kJvh?x5)gkAH$72lv_6m9c;Zu^3>Yhpz&MHx<@sWi zKp5^{9;ua1|GG{gm`|QLwnHUYd}N_8IKJ z@k{T&nCycHXovSXq8e4$zXRPEcypp;11(08p`hsKx^vFS_}@I4HO4>XHHg;L`s4yDeC-}cNqma3GP^$;Uub4+qPx58~1Tc$3`TPW0T`0^7Q zGO3hMMB>?!{h7aiqC$^&Di7~*%Sm4zDo0_?eu<;sB3Qt;pDd5PkHZv??#|ZZV2!Wm z`(}b&H^aNQy4x1)ZG6Odh9E&{_0+HfqB!x<53(7F&LoBg>4$grpRjU4eA0`POu{$u zwwDhWYg00jUgv=T;wpvhmXzTXYXs1z2hVx6S~$u#zUtOrS(NkhuhzwW19VNUbiM6n zf@IWPb#3}I;9BI{j9{QZu;^=u2m^uLilA>TKwIQ@Ybyq_>8e6UcR0C!1WO)`KmD55 zGzjHtVgHRhP|zW~;`Bt3x<*P!Ql7d7`MZw=1`^WDK1Plt-+)J=GpCCz8j!pk|Mc`C zq1vt4JRbO6$Kzq6P;^@$+}4Jb*A{`F%L4vZ20;t`Q|*WVmYI3unSvOmG{cbBU#FwH z;pD$D0B?8Nn8T~j- zeUutL+J=8|CNGA^1coJmVcph-AOqNAlOOIQRq!*C{yP$tcMaaDsg0l)-1zMtPe_E9 z!ydf{SXnp<#{xvd^$pNiv6XOOldM@I@JkiEH%m+WRyM!kRyG2+g4ZTqHI^uWD1aXU zwhMYU&yM0~2ZDM8s}S6Y;0$^OUuDu=n%+3lTQ_j71q;1vpzAPQ^fYrM3G*J2(Y?RvC_<~;c$S`l%kel(DbR#*X=ihtD*sU7W)=v;lDw71RM`PtO>$3qfszl zGa#_?r{B!YEI4QA^`F1~=7;==v#w>IrDxsK@?iPB>vpgED82N<^wRU`qc7n9iVNwJ xE~L+VZT0!|y6tHn4=FxZI{o~R>E{eN*Q^$y=zw(10Dt;|%=qQA1$KHJ@_(T!?7{#5 diff --git a/app/api/__pycache__/tasks.cpython-311.pyc b/app/api/__pycache__/tasks.cpython-311.pyc index 99a8554e3aa133c23bb515d658e8733b0fad00e4..34750821bd5c00012c93ea6c6a433dd52ca86335 100644 GIT binary patch delta 42 wcmewy*cr&ToR^o20SNxMdt?bpZsa@5!K>?P6;qyHlwDkqn4G#fh;yMl01?U!T>t<8 delta 156 zcmeAS{2a))oR^o20SLOoIJ2B2Hu9b2sGsg?6_b*moSj+}U!Gr-U0jfuoEnpypOjx> zq-PKx4ixgpFDg!rNh~Oc0V&ALO9#_ng~c%`scDI&IVCa08Hq)y@hOQVi7^F5`B|yS sB{8{)McJt(V6ph*{2ZWAeo=fuPGU(~eo<~rQfXQm(9X>tIA+QN0EHVoS^xk5 diff --git a/app/services/__pycache__/__init__.cpython-311.pyc b/app/services/__pycache__/__init__.cpython-311.pyc index 030fe0362c78ff310f6b92c34b17d4db1e0e4975..f4c03da49f8c72bf9f6ef54753dcfe7056a8f434 100644 GIT binary patch delta 38 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 V^J++ZOK(o-As>6l7!We`e*v*4|F8f6 delta 5426 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 diff --git a/app/services/__pycache__/collector.cpython-311.pyc b/app/services/__pycache__/collector.cpython-311.pyc index 23034c82b945d111d4ea13365fdc39e86b8b2bf1..ddd278de3003c1141517a23ec8310db4fb465816 100644 GIT binary patch delta 39 tcmZ1`xkrL~IWI340}%Xi_t?m-&cmoDXD3Rr8y-r#Tki3sqra^C5bTwMfq8&$t5wl oiAC9|C1A1mxT7FS(Oj2oD8qm(o?rdLK0X1AXr~m)} diff --git a/app/services/__pycache__/scheduler.cpython-311.pyc b/app/services/__pycache__/scheduler.cpython-311.pyc index 4d6baf55f9b111f3ec3158e917f83452df80e5ff..e3265c7a64955dfd012ac88374a18e8e5ed089f8 100644 GIT binary patch delta 42 wcmeD6UF^fRoR^o20SNxMdt_-zZRESk#cSqj6;qyHlwDkqn4G#firZKk00#IB%>V!Z delta 156 zcmZ4N)9cH(oR^o20SIn|ac1R6ZsfblRlmU1DkddAIXkr|zC6DuySN}RIW;CZKPkV& zNY5ZX94O?GUsRkLlUPs?15%Kgmky@E3X5Y>QqvMkb4p^0GZKqZ<5Ln#5@QOA^0QKt sOJZ^pi?UNoz+&;q`8hzL{G#}RoWzo}{G!~Lq|&rBpq-n4aA`{e0G`u4DgXcg diff --git a/app/services/plan_generator.py b/app/services/plan_generator.py index 1857194..20e24ff 100644 --- a/app/services/plan_generator.py +++ b/app/services/plan_generator.py @@ -626,121 +626,126 @@ def save_plan_to_db(db: Session, plan_data: dict) -> int: review_date_str = plan_data["review_date"] week_day = plan_data["week_day"] - # 清理旧数据 - existing = db.query(ReviewPlanV2).filter_by(review_date=review_date_str).first() - if existing: - review_plan_id = existing.id - # 清理关联数据 - db.query(SymbolScoreV2).filter_by(review_date_id=review_plan_id).delete() - db.query(TradingPlanV2).filter_by(review_date_id=review_plan_id).delete() - db.query(SectorHeat).filter_by(review_date_id=review_plan_id).delete() - # 更新元数据 - existing.week_day = week_day - existing.data_basis = plan_data.get("data_basis") - existing.core_conclusion = plan_data.get("core_conclusion") - existing.bull_count = plan_data.get("bull_count") - existing.bear_count = plan_data.get("bear_count") - existing.neutral_count = plan_data.get("neutral_count") - existing.opportunity_count = plan_data.get("opportunity_count") - existing.risk_warnings = plan_data.get("risk_warnings") - existing.actual_data_date = plan_data.get("actual_data_date") - existing.data_date_matches = 1 if plan_data.get("data_date_matches") else 0 - else: - review_plan = ReviewPlanV2( - review_date=review_date_str, - week_day=week_day, - data_basis=plan_data.get("data_basis"), - core_conclusion=plan_data.get("core_conclusion"), - bull_count=plan_data.get("bull_count"), - bear_count=plan_data.get("bear_count"), - neutral_count=plan_data.get("neutral_count"), - opportunity_count=plan_data.get("opportunity_count"), - risk_warnings=plan_data.get("risk_warnings"), - actual_data_date=plan_data.get("actual_data_date"), - data_date_matches=1 if plan_data.get("data_date_matches") else 0, - ) - db.add(review_plan) - db.flush() - review_plan_id = review_plan.id - - # 保存评分数据 - for s in plan_data.get("scores", []): - pivots = s.get("pivots", {}) - score_record = SymbolScoreV2( - review_date_id=review_plan_id, - symbol=s["symbol"], - name=s["name"], - close_price=s.get("close_price"), - prev_close=s.get("prev_close"), - high_price=s.get("high_price"), - low_price=s.get("low_price"), - volume=s.get("volume"), - avg_volume_5=s.get("avg_volume_5"), - amplitude_score=s.get("amplitude_score"), - volume_score=s.get("volume_score"), - change_score=s.get("change_score"), - trend_score=s.get("trend_score"), - activity_score=s.get("activity_score"), - composite_score=s.get("composite_score"), - amplitude_pct=s.get("amplitude_pct"), - change_pct=s.get("change_pct"), - volume_ratio=s.get("volume_ratio"), - trend_60m=s.get("trend_60m"), - trend_15m=s.get("trend_15m"), - trend_5m=s.get("trend_5m"), - direction=s.get("direction"), - direction_tag=s.get("direction_tag"), - category=s.get("category"), - pivot=pivots.get("pivot"), - r1=pivots.get("r1"), - r2=pivots.get("r2"), - s1=pivots.get("s1"), - s2=pivots.get("s2"), - rank=s.get("rank"), - data_date=s.get("data_date"), - ) - db.add(score_record) - - # 保存交易计划 - for p in plan_data.get("plans", []): - plan_record = TradingPlanV2( - review_date_id=review_plan_id, - symbol=p["symbol"], - name=p["name"], - direction=p["direction"], - composite_score=p.get("composite_score"), - entry_low=p.get("entry_low"), - entry_high=p.get("entry_high"), - stop_loss=p.get("stop_loss"), - target1=p.get("target1"), - target2=p.get("target2"), - trigger=p.get("trigger"), - amplitude_score=p.get("amplitude_score"), - volume_score=p.get("volume_score"), - trend_score=p.get("trend_score"), - activity_score=p.get("activity_score"), - category=p.get("category"), - ) - db.add(plan_record) - - # 保存板块热度 - for sec in plan_data.get("sectors", []): - sector_record = SectorHeat( - review_date_id=review_plan_id, - sector_name=sec["sector_name"], - avg_score=sec.get("avg_score"), - avg_trend=sec.get("avg_trend"), - direction=sec.get("direction"), - heat_level=sec.get("heat_level"), - leader_symbol=sec.get("leader_symbol"), - leader_score=sec.get("leader_score"), - members=sec.get("members"), - ) - db.add(sector_record) - - db.commit() - logger.info(f"交易计划已保存: {review_date_str}, ID={review_plan_id}") - return review_plan_id + try: + # 清理旧数据 + existing = db.query(ReviewPlanV2).filter_by(review_date=review_date_str).first() + if existing: + review_plan_id = existing.id + # 清理关联数据 + db.query(SymbolScoreV2).filter_by(review_date_id=review_plan_id).delete() + db.query(TradingPlanV2).filter_by(review_date_id=review_plan_id).delete() + db.query(SectorHeat).filter_by(review_date_id=review_plan_id).delete() + # 更新元数据 + existing.week_day = week_day + existing.data_basis = plan_data.get("data_basis") + existing.core_conclusion = plan_data.get("core_conclusion") + existing.bull_count = plan_data.get("bull_count") + existing.bear_count = plan_data.get("bear_count") + existing.neutral_count = plan_data.get("neutral_count") + existing.opportunity_count = plan_data.get("opportunity_count") + existing.risk_warnings = plan_data.get("risk_warnings") + existing.actual_data_date = plan_data.get("actual_data_date") + existing.data_date_matches = 1 if plan_data.get("data_date_matches") else 0 + else: + review_plan = ReviewPlanV2( + review_date=review_date_str, + week_day=week_day, + data_basis=plan_data.get("data_basis"), + core_conclusion=plan_data.get("core_conclusion"), + bull_count=plan_data.get("bull_count"), + bear_count=plan_data.get("bear_count"), + neutral_count=plan_data.get("neutral_count"), + opportunity_count=plan_data.get("opportunity_count"), + risk_warnings=plan_data.get("risk_warnings"), + actual_data_date=plan_data.get("actual_data_date"), + data_date_matches=1 if plan_data.get("data_date_matches") else 0, + ) + db.add(review_plan) + db.flush() + review_plan_id = review_plan.id + + # 保存评分数据 + for s in plan_data.get("scores", []): + pivots = s.get("pivots", {}) + score_record = SymbolScoreV2( + review_date_id=review_plan_id, + symbol=s["symbol"], + name=s["name"], + close_price=s.get("close_price"), + prev_close=s.get("prev_close"), + high_price=s.get("high_price"), + low_price=s.get("low_price"), + volume=s.get("volume"), + avg_volume_5=s.get("avg_volume_5"), + amplitude_score=s.get("amplitude_score"), + volume_score=s.get("volume_score"), + change_score=s.get("change_score"), + trend_score=s.get("trend_score"), + activity_score=s.get("activity_score"), + composite_score=s.get("composite_score"), + amplitude_pct=s.get("amplitude_pct"), + change_pct=s.get("change_pct"), + volume_ratio=s.get("volume_ratio"), + trend_60m=s.get("trend_60m"), + trend_15m=s.get("trend_15m"), + trend_5m=s.get("trend_5m"), + direction=s.get("direction"), + direction_tag=s.get("direction_tag"), + category=s.get("category"), + pivot=pivots.get("pivot"), + r1=pivots.get("r1"), + r2=pivots.get("r2"), + s1=pivots.get("s1"), + s2=pivots.get("s2"), + rank=s.get("rank"), + data_date=s.get("data_date"), + ) + db.add(score_record) + + # 保存交易计划 + for p in plan_data.get("plans", []): + plan_record = TradingPlanV2( + review_date_id=review_plan_id, + symbol=p["symbol"], + name=p["name"], + direction=p["direction"], + composite_score=p.get("composite_score"), + entry_low=p.get("entry_low"), + entry_high=p.get("entry_high"), + stop_loss=p.get("stop_loss"), + target1=p.get("target1"), + target2=p.get("target2"), + trigger=p.get("trigger"), + amplitude_score=p.get("amplitude_score"), + volume_score=p.get("volume_score"), + trend_score=p.get("trend_score"), + activity_score=p.get("activity_score"), + category=p.get("category"), + ) + db.add(plan_record) + + # 保存板块热度 + for sec in plan_data.get("sectors", []): + sector_record = SectorHeat( + review_date_id=review_plan_id, + sector_name=sec["sector_name"], + avg_score=sec.get("avg_score"), + avg_trend=sec.get("avg_trend"), + direction=sec.get("direction"), + heat_level=sec.get("heat_level"), + leader_symbol=sec.get("leader_symbol"), + leader_score=sec.get("leader_score"), + members=sec.get("members"), + ) + db.add(sector_record) + + db.commit() + logger.info(f"交易计划已保存: {review_date_str}, ID={review_plan_id}") + return review_plan_id + except Exception as e: + db.rollback() + logger.exception(f"保存交易计划失败: {e}") + raise def get_plan_data(db: Session, review_plan_id: int) -> Optional[dict]: diff --git a/data/futures_analysis.db b/data/futures_analysis.db index 011ffd19fdb7e94c769400e616a1d02079d013e3..d2b6daca840172267f4741310feb4d1553787e2b 100644 GIT binary patch delta 25438 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 delta 1330 zcmYMzZ)}rA90%}T`#iKy|J@2WIyPOgI7Qtkoq!W@#nFLG*3Icu5WV5QRaZNQiq0yV za+b=#;^-b_L#Iv!#Jak%^BFU2QKJc&A(8UR=$J2Nv?U@+0~p~!&xzBF3y&4cI^q~9te{q zs@&?H6@Rz7>xflqk(#7NsYZWFKcv>SValUA^7J=HPq(>YDO?97a6Q}r%iu=13373z zPzKAv11rD_iy*S`I+z$`H zgRlj*!b7kP9)?GNK@)6;N8vGe9G(yp!%tRSE>P$h9a?*sUZ$7mUo=B!=rsMAo};2E zW1l3#7a#lGCRzGAJ>uM{=2DlW(=0v0IMuv^2uHuS$SivPYz{6oIn78@K*I@Ruw1N& zkL|YSZktlWG?pxVA0iMEAO=hIGBr~ibQ((SS5%`bxOFZ;zPM5rG!eTj zyLGlvOS`hoSRuOwn(mN=du8yv*)G!&9lc0@qi5-NbYw2Ei>R($5p#4r5QL}TX=s5E zJOg29g=e7+cEEG+JiGuq;YD}}+Tmr0z$@@7?1B#HgxBD8*bN-sfGF${wf%^eh^Fg@ z;RK9;fUiWlURz#kl@zM8m04^`QlYr-qJK?-9@Vn*3=4<@|4=g%b@Y4f8*w(JdF=U$ zDWao=_NBH;>rTrd^H1i*O2`z+t=n!Aksq`@MuSrqP>pA_jiPBrYmvptv{r3aP-j9z XIvSdLoWDjx7c>}!lOl9stegD@1w2CQ