From 332f0f636d2a8b4215ee000442c5780d917a2c9b Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Fri, 27 Mar 2026 02:55:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=89=8D=E7=AB=AF=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/__pycache__/__init__.cpython-312.pyc | Bin 1276 -> 0 bytes .../__pycache__/ai_analyze.cpython-312.pyc | Bin 5601 -> 0 bytes .../analysis_charts.cpython-312.pyc | Bin 4537 -> 0 bytes .../__pycache__/documents.cpython-312.pyc | Bin 14740 -> 0 bytes .../__pycache__/health.cpython-312.pyc | Bin 2430 -> 0 bytes .../__pycache__/library.cpython-312.pyc | Bin 5618 -> 0 bytes .../endpoints/__pycache__/rag.cpython-312.pyc | Bin 4089 -> 0 bytes .../__pycache__/tasks.cpython-312.pyc | Bin 1598 -> 0 bytes .../__pycache__/templates.cpython-312.pyc | Bin 8294 -> 0 bytes .../__pycache__/upload.cpython-312.pyc | Bin 8350 -> 0 bytes .../__pycache__/upload.cpython-313.pyc | Bin 8216 -> 0 bytes .../__pycache__/visualization.cpython-312.pyc | Bin 3196 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 577 -> 0 bytes .../__pycache__/mongodb.cpython-312.pyc | Bin 9546 -> 0 bytes .../__pycache__/mysql.cpython-312.pyc | Bin 9629 -> 0 bytes .../__pycache__/redis_db.cpython-312.pyc | Bin 10535 -> 0 bytes backend/app/core/database/redis_db.py | 53 +- .../__pycache__/__init__.cpython-312.pyc | Bin 2873 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3457 -> 0 bytes .../__pycache__/docx_parser.cpython-312.pyc | Bin 5713 -> 0 bytes .../__pycache__/md_parser.cpython-312.pyc | Bin 9774 -> 0 bytes .../__pycache__/txt_parser.cpython-312.pyc | Bin 8798 -> 0 bytes .../__pycache__/xlsx_parser.cpython-312.pyc | Bin 9524 -> 0 bytes .../chart_generator_service.cpython-312.pyc | Bin 17853 -> 0 bytes .../chart_generator_service.cpython-313.pyc | Bin 17747 -> 0 bytes .../excel_ai_service.cpython-312.pyc | Bin 8087 -> 0 bytes .../excel_storage_service.cpython-312.pyc | Bin 19214 -> 0 bytes .../__pycache__/file_service.cpython-312.pyc | Bin 4975 -> 0 bytes .../__pycache__/font_helper.cpython-312.pyc | Bin 3333 -> 0 bytes .../__pycache__/font_helper.cpython-313.pyc | Bin 3300 -> 0 bytes .../__pycache__/llm_service.cpython-312.pyc | Bin 9899 -> 0 bytes .../__pycache__/llm_service.cpython-313.pyc | Bin 9750 -> 0 bytes .../__pycache__/rag_service.cpython-312.pyc | Bin 13101 -> 0 bytes .../table_rag_service.cpython-312.pyc | Bin 17869 -> 0 bytes .../template_fill_service.cpython-312.pyc | Bin 10985 -> 0 bytes .../text_analysis_service.cpython-312.pyc | Bin 8776 -> 0 bytes .../text_analysis_service.cpython-313.pyc | Bin 8841 -> 0 bytes .../visualization_service.cpython-312.pyc | Bin 19540 -> 0 bytes .../visualization_service.cpython-313.pyc | Bin 19314 -> 0 bytes .../src/components/layouts/MainLayout.tsx | 34 +- frontend/src/pages/Documents.tsx | 995 ++++++++++++++---- frontend/src/routes.tsx | 19 +- 42 files changed, 833 insertions(+), 268 deletions(-) delete mode 100644 backend/app/api/__pycache__/__init__.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/ai_analyze.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/analysis_charts.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/documents.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/health.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/library.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/rag.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/tasks.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/templates.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/upload.cpython-312.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/upload.cpython-313.pyc delete mode 100644 backend/app/api/endpoints/__pycache__/visualization.cpython-312.pyc delete mode 100644 backend/app/core/database/__pycache__/__init__.cpython-312.pyc delete mode 100644 backend/app/core/database/__pycache__/mongodb.cpython-312.pyc delete mode 100644 backend/app/core/database/__pycache__/mysql.cpython-312.pyc delete mode 100644 backend/app/core/database/__pycache__/redis_db.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/__init__.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/base.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/docx_parser.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/md_parser.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/txt_parser.cpython-312.pyc delete mode 100644 backend/app/core/document_parser/__pycache__/xlsx_parser.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/chart_generator_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/chart_generator_service.cpython-313.pyc delete mode 100644 backend/app/services/__pycache__/excel_ai_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/excel_storage_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/file_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/font_helper.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/font_helper.cpython-313.pyc delete mode 100644 backend/app/services/__pycache__/llm_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/llm_service.cpython-313.pyc delete mode 100644 backend/app/services/__pycache__/rag_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/table_rag_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/template_fill_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/text_analysis_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/text_analysis_service.cpython-313.pyc delete mode 100644 backend/app/services/__pycache__/visualization_service.cpython-312.pyc delete mode 100644 backend/app/services/__pycache__/visualization_service.cpython-313.pyc diff --git a/backend/app/api/__pycache__/__init__.cpython-312.pyc b/backend/app/api/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1a3fce860c6ed4c2db23ae817bd52e14bf888641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmbVLF>ljA6uxs3J9grr4ye>ZPzjZiG)c=^AtV-57O2W*B3ak?AlLeA>uiJ4iHQY9 zq>=$eY(*UqV&E4rF+~bWbt`HMTdN9H>cm~!$O~ogN&fuacklb|o$UABGz}ou&h$63 zln3CaOvWpB9vt}!0Gq%CHgKV!nSA}^rEwrOOCvBf08{U7_8Yy% z5Zu}U#)V9EWYq>%Z3yPls+oShS094el$q@}d(9!Jrp%3gttV77Df2I<+Q^z4SaU;A dPwN^Zt2wZQ+kDE+kF14(weSPnW|zfX{{px+`)U9H diff --git a/backend/app/api/endpoints/__pycache__/ai_analyze.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/ai_analyze.cpython-312.pyc deleted file mode 100644 index 7ee04aac5f88f984f6666c79d1ba14ad7f4f38b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5601 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 diff --git a/backend/app/api/endpoints/__pycache__/analysis_charts.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/analysis_charts.cpython-312.pyc deleted file mode 100644 index a662411b78a2732fc734911b7b2510e62567eac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4537 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 diff --git a/backend/app/api/endpoints/__pycache__/health.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/health.cpython-312.pyc deleted file mode 100644 index 21a536bef85f643c88ab79896a1c3a83f20ed138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2430 zcmb_eZEO@p7@pbP+xyz~+ABxPS9>Rga?t=mNI(q9OtI-Z{HR zIa16ONWg|q#n47R+7L_?5lo0CC4|_-U;b&W371V1HG0>Y_~S}zg6I!tc5mC0h(C;z z%Pot!?xZK`fq(&sm-#sS)OnN4M@!U;yq!xdyRwyC zHbZtJ4pkwxgQ2tzM)sWGZkDOh>SuU+pYpDn_ZBL=eb4Z&dZu@Eg?CNX7p}=HBB6K+ zy*COYUly};nw!J&|r7}9g zVb*XZv)bEaZ+b>a@4y3q^}Pir4^FOxPfjnK_@eB&Ko&KW{v{FqVt%g(`8!=Pm=`+%ajns zJ885}6^+it=sp|nAyIU#0icIOVm=w`8E5T-$BfLWPWGvhy;#AFKpAXLFhXb`YVmN5KJb`cOAG%pL&U@E;kFF!XMePQ|r4TmW# z0`i(J>KV;&Q+X0QnKoP+!iN+IX<;vRQnDawSyhT5HLj@0aKCm~LTOz|sn%4ylu(eW zW4B2qYF&ti6%z@}Qk>7|lA7u^+=`a!Na3WYleGm)@Z|`q%c75!`+}u?tEbUf$QeF~ z?0BhdPq(@kr#i|0+g?`^NZW@*d4E>Zk(g|27o{$w%57pgO{&sH>~u;|b*;@hlC|lq zAy{TiI*6n${2ZCNnpEvq(oBQLIZ&zri<)w~^MPQlHDA}5+g;)~N7JOY?x8n0?hTH4 z*W{OlPwg(bI7evG>p!>k-K}HZP=3Ypr&=l2H0i5<=xhGg*KE?}JRrC-FEsS;8W&pf z!qWb(aUpE?OHQuYGY7b!_d>Yj0=3H~11m1YF2p7Rs~-l|j|bLI1UCE-2<7Wn%p|&4VyUxTHdn3*4XvoA@LTWdgc#Ai( zi5=Zw;u|5gH&OgZRXIhi!{kL}>8kUECY|G?&eEH0Cn%Xw;C^6UA2#zA8L+O;ozJK4 zee$>bYU1>2jGPVb%CsY_A{}Y#rte;xzJI@P<>d6xP+?%W>~i@`p>L?zf4gx0qk=h= z>5Xabrq_W)_A$V#Xe^`x9HO|7;zaZsQMDTDfpEU{FBs=)d9n746^Yy5qd z=9Oa(Cp;q9n@%W)(0|_Zt^VTOd;ia#&8aH)EYir#9b3(661uhRYC2M}>let#Yjl+4 zYklV?^j|`|MH-@b z2xk}ua=-BaHhvG57r=@suw@)<`O)p~Zyak_^PM}K<4ZhXTql?IECKg$B9-W({sN&Z_b@}3E}yu|RZsb3#_b+~SD$G|&}0O?Zl3Ui?3 dx4EqoaGAxG2VWd!2R9F>^W5b#bP`Mt{Vx*Lp8o&< diff --git a/backend/app/api/endpoints/__pycache__/library.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/library.cpython-312.pyc deleted file mode 100644 index a30bc1785529a52a0098981db4f77be1098bc219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5618 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 diff --git a/backend/app/api/endpoints/__pycache__/rag.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/rag.cpython-312.pyc deleted file mode 100644 index 0b45d0c8707db7a29f5362abe77042180b620457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4089 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 bxqAwXIKG^ro-+C_vsj=KFHxEl00sUZ52sEj diff --git a/backend/app/api/endpoints/__pycache__/upload.cpython-312.pyc b/backend/app/api/endpoints/__pycache__/upload.cpython-312.pyc deleted file mode 100644 index ee10e3d4fa45a1aa4c1979f442547867944a1dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8350 zcmbtZdvp`mnV*M7Z(EjR`H4Z8M-UGi3??9Ir~x|(G`vX@A6gxu85_BJcxOhoArc{! zZREs>O+$l|kU-Oi=4E`&Ia84S!XLrAQMe>7DK$8NhGO-sp^5A>o(1VpYAAqO+gYVR zG!$|L%`1|Hj2CNCxd63>HD{ExYz~{-XHoenG9b9Rno-H`Wq-2=|vaHJxBAI0ir;N_9MQP4>^kTMzEoEo*m7UcnT^cENHdm4{ z)*Kj1%Q`d0nhj%Zm}acGQ^qp0<>|2+NyHU+&&%NBoI&RKQ~2C3Gs7;(;G8Y*LUolu z>IX7Ln|qLPEsCJ!GmgLX%-F>b#s;1pyL84`yWQ8AQmG&qc}F7M^SLx62yQ z+aw&)R&p?SprSrfib#9jOLYJC*4w`sf4zIWLtx#{T8htzY-T2qu;je7qma z5Sfk0JD*9s`-(z-^Oa*M+C=yBH{b4$6afkJOuTs>cqLBt0?DmkciuezM&i=1WDOEu z&TByed%S^wM>xQ7q97ab+Y|BzIoWuC^RgW8;lpjdl zlxRjRSxLwdfkH{3zEmHrD$7xF`X0@UN}qnS8ubXV4BGK#UAj%psj3sxL^Z6omE^5c zM%G0&uM({OH9AuQ1CrXHa!9{bUOy*T!;>KYOY}+l7Yswh7}2CsHKU!)N>OI|IkCn* z)7j)Y#I$0r+O65D=F)H09M!%`yhf=rCW$D?7l<~MqS>M5((kBNrH<)BRZ)sB&Y&+$ z)2X?rHcCb5zMPayx=`Ww_MrQ6)xC@9qPk{uxUv$z2slsM!diX+w9~K73_bF24_z}- zi>##X&u-#DqVw~4gqSqw1TmlBDUvu!h_lo#P_rSX&sg(0YD@afTE)3)DXLf3a_TN* zoF*Go7Zs&KHloac<$^-p(+LTn6v}JHRXR@R{L@clo${K(X8yooW<~tw0L&+vV^okL|;|sH# ztYtaT>kr%`D<=L25|~s?JD6UXhGzs~5@KxN`SBC)jdwl`%cStSdG2E3_2=A9Y-GQ> z)H!zXpA`yc1?uWd{IV10w#f`O$6#y?LS%nqH~{7^g48rA(}mxU{qeQL?|R%$7saD` z9%-hF#4oU&-d2wFw0Ok>vNg>6oBSbfz=JjpnNw`Cr`hcBlOH6W`EcUI%WmhyU9<+s zKqz#HH_zQV{}v2pmGvqcUJK1KBeVqkqRa%sZQ$25;Hy|3#b2@w$>34k56FV8yfzSS zYC>fGP-9p&<0*oa$W`%qm>Vw0`XH<<>lMASP7Hg{KFJ1jER((wsKdNW3nK3_@MxoO z=kzitGJ3dnQP%mwA(0D-d>LY|)VSh*z_9+vrXgMgGl`ISk`opgT{sr(C z4#P^`BK~%Sm|R4d^SWxDt+|$4+Dl8T>PB+wC4K#Mi@ht>5xZh3AF`C6SvhQZpqCo5 zEV*J?F=SaWY*~5a;ZdEX`>7$_Lg+VIR66RY?AP}mlGg5#?0fGrw8c0{&<5kAv7FgX zUN4$;+VHaBRnryQytwYJmMAE{;#f80ST$<4kHYAWc04*-Pf2hvJnNcc?iEMXkfW;KJ?vQDQ4f`QCD)15=3I?ZBh9KD zGB3YwadaK-I6Q2bBkAW%RulI5-`-tAn2YZaB$GR;&$(vGze7+kxoi5|E^~)jDy%;5 z8<_ikWB=olWBrJJ176Sm&_}yJv;OI^%MVMd9v#WuCh52ReUd@l{!6HVeK=ZMTAxo2 z&bHSP#NY~Y^Lou-)g}`ZKB^(1;iL5=3u1zW zhl}QsrpZ(jCsPm$8B)wa5xngv>JfaY@C7JSVb6axgdlk;N`^?5jL{<0E2%lN zU$QPrMCmBiN2S~@geud8J8Aa@t_>+WPS}w#B9Z~8=2R%6*1%1I7IV~6lsSuL3MtEx zA;ras)v(M=^nF^@*&iiYU5q)*WH~Z@8}m}?#d6OsHZGSz7Fs9~E+&p!Zf+1kX3N{sDEo@RbA)bmTwV*z?BMUQ3Zfi~Tx z<=3J-b}~pDaDpg8M|RsAti74Q%cF_IrYqTg$KatD#qwNc zFL`5r#qs9;+PG=VT6V=+Ib^LIH9JNN%SRn$lRCn-{A)sEGsd-(W+Ja3Z7cpZrdWo( zY0I$c{O$qk`;YZMEIDdM^y?K%yL!v#D?j_EKd=65k+f>}NbVj!vTdYpdzOY6h}{ZW?M2F_lOwm8;BepH9TjOuYPN%B?F$#+N+j zz%oNe$Dp98=p0 zHhooyrh@q_O-$)3t7G*u(f1iLG|?EN4pUj0Xo|FgWLPJZOt} zW=k%AI%eAwLE%p_Ho|)|9`8;(dm3Ugoe=T)I6;tgL3nzbxO(Nvn!Kz(4?z@MNyp6j_YoiY@>7LNy|46+3O^8-Ss*1 zr4>7e?7JlME>&|fd}>9X(7)nrYwrQc@!*Jl&G-6LWFJ6rmXpUy7Z9gW=8R?m@g~Z= zWvE?7zw54DL=P@vAUn8>hT223lRlJdZwd3_{Vo&%3AaGC-n#@*C>)tY{3Jxk6Gu)a zx-KN*znFOC1d8SYkzi;BZ}9*v26`EgMT{B66iD&iYX>tx z17{_5MN`sQS-7G{jfl6O?8{eIWH+1%68$t94O*T6Ad4hAPbk-Qu=waM zi4$1-g=7Y(&^#T8;D}~NT65L@Yyn%?SETO5QBo{dTd*%NrQwQcITwp4KENrOLZh>M zNqQ_mfM=r5l!4X9OovTbzGPO!3a-+Kf(gYQOo{5gx)e`zy*F{BWBj>y(jnO|JF&&+ z_#P*dc;R&7?dKG${(lekQbT@qsRN6JL`zyDz!0XIEkF#iEZ3Coxc_~g?LM5>J!Q_g z6Ws5S=G`Ng%KC5%7iu}!9sr0y%Z1>E&(+J?-6%3!0bY;shghy1Q*Xlo5*wbT@M)n(+CI{g*a3T*W7^L=S4_#WowA7Kx4HB1C3!m=oN)!;l@UQ zn%S@~5`?RDg#dA+m&HM0Fi?TthwPh_d-t-=> zjX{p}dp+X87EabFh>nnfb^wl|cxkuOe*(@$1~`*y!rm8q_Gu2x^xhjg8Z}6E*=4GQ zm5pdB$tyfM%7AZ(fOPYlQJ(ULW!=VuA}2huT{a;=BJgA0kMMjwz!W&tl{Es#{Y<6- zY2lH{mh}*Bw|WB+PPQUcVOvYkZe*8 zohRTIMA_bvnXrf14Bzhl(lV&WH~AL2P5gG7#(IcDZx8n zGssIPSAqkY7vV2_0jr;k+g%WH+%P$=S?wpwj+gZu>~9#c{;*@?m|7mTy5buVm|!2R zT6k*dwZC3Qnpn|oLGtUSH;<+ZP^ld3kyw@M{-Ha`CDm-m0# zJlOojh8=I%`%RL$OmgnLYH^M_3Z){~kYjN-1-OPS|76MWk{4&iwbybiT|e#kX-|Ex z`!6}G2NsT+bGx>7Z0*sW;RcLftl4(?Kz!?ndHXjsk^3Nk5(?tcUE7%ph3Yi}Yll{C z?lGLUylm;Ehl`f>?)su=`DdX3aaZ<%{`i`WH&`)(%+zz3tM+Ywcbi4M z#l0rUfiN27UZWyN|9^m_5%%^d`OsYQSgoecMGWc->+G7rIa-uoV6Q9E46fCnXU!_8 z`L`9tb!GIQj2rb(_}GTJeQYK=>Q1@}U4&_~|ADT^nGROT;G5u*V1Nl#9(?IDe zmvtTwm=2Fe)-`$oPHpk?DCp(UwT4ID9^X27^l3%5CMhZax5MAQ1VyQ|U@72>7>__a zS%*MHD8UCUZ;15@{4T^~FKQ|VLspUeGA2}DSS49fg7hNP?hEr=g=)-HG!lhQvH^7W zM+#!8_uwy49uL-8021+cJmp5M0Rtz>n*HH$0AHJB8jwK@0LnCQz_(rm7Nh$Bj^25s zPwx<4!;`@3c2EC^rxb-{=>Osi};eB{c(j-aVrYKVLjg}zm$-fYFe$eC@k&S^y0y*W#wn8rPaGf%Jy7!E;z$VYaSnQK5@06w5L{DQa4gi zf7`Hu+)j=f^CxMPxn58*$)F5yvljQ*kLOJ4a8XZK^Y38VuW5oRoTPB=W(tj2@^p!0 zUN%ftfGl$tqCp-Rac;SqU))nJEv~)n{cO`n{*K$a+2mew)MA^YQRaGH5$4XI0t{xc z-N6Kid*vjBYd6A&cl|SEPnX5phRMRK%d7i+(nH>n<@;|F`5?+u!-RuutV&N4O*1r&TcfqS{tRZ)ULtxneHCF|^rR^Ta$C>N2}mYAmGR6{st}j#BHQvx}}kypcCmQ#@Bsiv?YI6{s$W zEEaYZxHqInY7lSM#&_vpv?W#3LoJ85^0s=q3&Sj*n}R9cj^SDzpV!6kj;>-pzl-ZC zVSy;`>?*A_@&zU6QQf0dYW5{C`&Mnv^qVi7Hy_IvrRFH+OZZZL313#PtEKs+T_qWF zEQ2}pyen&tr7*|#G;Iyy%jeBu;VTI56s8H3muFFNEyC%Fc~mkvW%+vu#cVEDYI_2_ z-kUW`c`sYJDq0LYa?`IoHTB{9Qx~3|x_HLbwEIEV^mA_}hJMP;;008&iV51>;b=q< z70%Ni4Ey{ofuNx1$TMfx-o3k<2fBs+NFW?i*ga7}JX}dBc0M8szP>=H*DXl>;gBRi zqp^cv`GW0GvGf2HuOx^E1Kqfj+ZU7ucKbwVIbx`el8K@gU?G#gN?OtPi$YIeK+#2f zz0whVwE&X`t6HL^7W@c9MND~1ns>wuV6i~#%){PswC_Oq3;A-wSb7yJX22#)WW0OSPrrZuhXs%&*E;kAqxSjny`d)9v!dW3S#ZE zX3cBx=&T^(HHunVt==Xi5H z6Vi7AM{04~H7Nb&EgroU)zI2nUC2Xed*~~Gwd85IZl?yN-yXd-E@bGa_Ry)3fSWP0 zFg-$p_U-pDd=Btu=y2Qxvzxcp(;NXj5AoK^`+muy|Y}ad5qeQ&Oeom zyPU^67Q{-*D5Ex5y1GVCR8to|xcSZp@6d`_iufW?$=e*m=H6R$nf;3A6j%Zn$bKKx4+ z!&QZcx)Lv(AW*x)5|s-I)g(pt_k@F>;-Xj>lRTaO<lITCXTHBwQGeXz5BU&N;vB4IB+BgKTTUDEymc34yxDI!*yM0`+WaC#e5 z9=*aqL@{)SLlGeq5z8=ny(mc0U__w=2`f~5DM?XEef|B_zWzY95c2nj1EGkNG>%pM zhZT#u2%rZSU#x+FpyiNs2)1Yj9YwRNkR^Ahaj5aSwRDt`Yn$WN7TMTx!{!)zeDLuJ zTSeSfai(V6cJC-1x2>75ZHU`8jN59C?wT~%hMyQWtb}osMWvI@>M`T!5xIV^?C{L7 zjE$Q`jES4&D%cL{M$wYjO{YvhGEd|!j~VXhQ9;Fov-Ya9cGBXQgxMb&d}y+uY|fx7 z;9}ez3o_Y;%!6jR;NDU0%=hK|+H1zT|I#DNlIza$3FpSRbK_XUxO3ZJ3pD1ITra+7 zqIgZbc+F_5{5`*1yhbh-p4U%hwBn}rVf`$S$Q#-|w0&~zrlF3(j*)N2EtQiso6k3% zZH%?x7I{f^+_L_L%{lag!5@sOZ#57>Bd7LPKEN5i~U+gG0YSX8WCf<1U)~{bm{OC2+W0`(= zYz8g_n(@P8F z&vfQ!H4nRp*}(!y3a{hY#qfDOcCC0rh;3rC%#Jboa~RIudhUE;=#_a^1a^AnC&zES z9fQrDe)bpH#z#H9q-DBw{@ui{j(^RHWSuDK*G>d%%tFVypv9QShlnk@riU8j zYI;T0^N)@-#mrOovI%>2++ICtaZVOiOghVE4JdE@EYjt1G5xFs!SAP3!S|#E zzxEt|!T#REW4mN$<2BsTUoX6DozDLbs*j&3ZlT1koE ze?W^Sf*Hb=^4hck2!SV!G$9C48R81gzZySO(JK%Z1D?SU2wW;cNeUdD7Quyld|uy~ z5<^eQJ}xyvmjAwYOnqjF@q86>Vq z6bA@ugG%&kvV|3J=72Y`F&Ln z#2s$g;?@Ku!$Ma5TpHW(vxB1tWas8<#w~ZXkXRdloYYds%h#YcG4Pgd4f-1l{ETbb z!2I3jrnSuFwJd;_H!#q8WNFeO3IqLNG4geTh=ciCAW83D1TPV8MG z6S2RVdG#giZ3Ux!p+#()6)wLfSQ)~C13w_G7WaZ;wht^H1awSC!QC)31QP6ED%9%& z`$;ck4f&K%Incv8iLOQx?LfQWvW9nlQ~17{eh7558M(k_f~95WjRyBHywk(DQ?^uF z9YR|H^urqQXpau4K!8f9=z)qp#V_pCzD+oV0QUYa!MtYALxzmKNd@rfnL$|@c!t;2 z(=>#az#TRZS;b@ILAf`k{0_`1WGMB#p`L-a5&!CvC*%TpZbudYsPZOFCBg{KLssm= zt3?a$Kc`{yX1v}GNVkMc87Bw!4H6Dt=P3tLB-RW(P?Me5Gb80YDc=NqCL3Vp*03S2 zg9S<^tUNy`6_3+rwe%>nT3Jo>>7m$p!zAt|tR3M{ALG z%6>3EJ%FXs_8Q}DwER#^KQQ!;sLcR#A{>}=m zEopkpccEI`345;=Pbz=B=sb|eT?}8HpErigP3A1qvm`nPGjOU-ndj?$c`=q4dUxjN z;Pf-^q@A`GP7tj#xQIPd3n7Tqg%(B6V}ES}7)Le`@(Tk5yPde1 z3RNxQq?Te(^|V*fkwBU9Dhy;uk8qHi2udWIaHI*M+F+pDhqK1j2SffUJl8;9uqQ0` z`6AM~a8D1Uh5g~~Xdi^gRT6lYK0k34`+`;EeZ;Xtji1-;3_yli3Sd%4oW4lJ*L?sF z+Dg(sIIGYI+;V+_Kj8C54)+U+LCwZU8CeU+hp5K9!4-Ik0{=IiWJz@qBTXED1un(H zMxGcX&2_GHD0IJH;qX$D5jz$J$WufhD=qHCFdYahhWigk1nI#J#f%dR!S9FxoO?Gy zx`8;ricS)QKUWyYn21=7D@Jg_5Bh>pL9w@hU)dgxw1lG}e=|-+WH{m2rB=NOY=A2* z8J@U0wZBJU;Di*jdeOYWfD}>ezJriR^6iHRGrmTZ+lc;*aDkiH(thbctSxTo_=-W+&5(Xj^BTiVC#+DZ z+j60Pymse^>2=#F+bA<$w06{ewP^j7%2>|tz_(hm{7mb_iY;R+<>mDk?EiY`V$Fre zu5E3TyL@uPetCaTF6kR=y8&1ao!Ksz)Wq6=vE1_Oz(DKMt-}XTKJok$<_8*?Pa9c) zuh0x&R#qqmuNM@C*Q*$Me2@(74~Ps*FM`8@L~OuG1S%Q;QtU~LD#*H#uTzpLN_x-_ z@XboZDLBP|Q-V-~Pfos&-zSM~OvHn`ia~u zj+qn_NbI-Oe527zz7=`BL{cFQNWQeG(X|fLT13(94~K&!gjN_x|B)=8!T<#l0pnCJ z4i<=OFJdWr2i=AzQiaTTUticC4GP=D0cZo!Leg1y&N385&CxWa`$~_f7V0;s`M0S0 zx2W`UWc?gDK1Zem+6XN-Ot}-LlB=eYkuBq<6-V`7nDRy{N4LqV8{(#|NA+_!NB7M4 zk6Pf$)5fPtkCn#ujZ+0*6qb(cc=7OOWff=YBVBqVl9imjT5oQFbd!b72r2>~kd2Pyrr7M5^tsY+DewfVPTq^3z#^~}9{*9%EH z+MPRd&Y5#&&Ybhj`6>|bB4{VR`%^qGBJ@u>ahj_znE5XZ1`tM3gc-~xm?RrzlU$Tb z@=>0lG%n#v3Q-~Hj=HTmpYTLIKzAj?q&ModXhOo5^hf;+ViEDQ*E>dLza%)q*t2LE z$gtRrJ#EYxafB^U%USeuguMq4_7VRGSD=PSdHcdyEzSu09c?&3Lfcs!Jiw0>n9(_~ zCgMoWesNiGP5A*-l&UyT~5S1Whx}8MA;RO5nzaGWR+}4W0L3$Ha#Symw~C=Z_nr6K3m)$ z=oK;w*&g3x@S5DF#^`pOR&X7fSpk#*L{OB0%VoF1RYp0&6BiM-vvt5DZp^NNFXo~i zpt>aHtB*r>5dD>3JW*cR-!j

O$?5 z^GMsv0KJeRrL4Vd7o!F=CyA}pJ;OQ4)We8Kqt3EgJGJ&m>tecCM|v;U#kKn$5r8S? zorF;zFR|qM5orOt9gU?s(fp3)b{ff#H0*I~FsO@bL5)b`9gzh{VHwneGnfgL2%TVOEtQ@Idw)#6^c2{)m;W`to7s)_aKAvinNPUgOvJBW z2TR^Cv{H@YS)d`b{_R_-e_ViX$W zMwR8TP67ylB`2ea!L65EP>73C&=L zN>h#ASXiOhY0POODWb?4k!EvUc@j9(jcOLUY4lAu%2%U`x?7>fu~1|8OB0n1w<;rJ zm67fZU;Cb~5 zmo*&FJN-?u9kQY=p^*RZ162gSW>9E@AFVtvhk5Ke&S3x&?6F27_F|tk^5Xyw(oq{9 zXIhYzer5XWpumdY>32Re`;O(_JC{4M4`RCzG8ZnxtMq>pGMfv$vwcb2e;}`O%#wGk)r5Mpu*T6)o6$&bbd%FyYn~5v5T(S{_X1F0hyv9>) zR?%VC8*YjlKr)_yqG4&FWK)+q=<-k{XQPlO(}Cp_6i*5b6GMa(zhYsJ5~9YQuse*jNk3C)+5q4p^(b_Cj$xR4EX(l!5)iX|3_bl1 z^w{4}&_wJ0j^^GG>w9Z%iS=V*{ou-*;(~7BYq26*|5Wzrwb^Cs#>MBmg$Dx1EE*Ia zAozfnSd`-l!^IK)0?)AH+~(D%GizpuV`BM9DO=Q4uD JwnkPZ^gk>9>1F@` diff --git a/backend/app/core/database/__pycache__/__init__.cpython-312.pyc b/backend/app/core/database/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d0c9f8627b2b5feeae8036e2563119733ab657da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmZvaJxIeq7>4hXw3kK&aS>f~&C*ds#i0~&u>RET2pnnekZ7){Nu^{{5I287q@XA$ z2)c-~gDyHbxn^-tQ{DU-1SjvRML}$Wxnh;!L_8Y{1#ig8An(?w3QRNwR zg5LV}^6x3*Nrp7l2sH+>nMmhhFz*sth_s9yFjEmvUyKNGS2w%Wn9Z$%U7TYjY6-X{ zlUmKB79mc_sSuJbhadV7_vnJlhW!o!72f~^Jwl#U2;qyOLG9fDaOegM-h#ec(EqCG LEy@z|+lA*7Rp7Fm diff --git a/backend/app/core/database/__pycache__/mongodb.cpython-312.pyc b/backend/app/core/database/__pycache__/mongodb.cpython-312.pyc deleted file mode 100644 index 1d102ac4d902a682e07bca5768d2660d59df30cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9546 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 diff --git a/backend/app/core/database/__pycache__/mysql.cpython-312.pyc b/backend/app/core/database/__pycache__/mysql.cpython-312.pyc deleted file mode 100644 index 0347b2cac5c64247ec9807e6427ca76f4e514621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9629 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 diff --git a/backend/app/core/database/__pycache__/redis_db.cpython-312.pyc b/backend/app/core/database/__pycache__/redis_db.cpython-312.pyc deleted file mode 100644 index 2a8d67284c3baa681f9d128c7660c3677863b97f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10535 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 diff --git a/backend/app/core/database/redis_db.py b/backend/app/core/database/redis_db.py index 83b21e9..ffba53e 100644 --- a/backend/app/core/database/redis_db.py +++ b/backend/app/core/database/redis_db.py @@ -144,12 +144,19 @@ class RedisDB: Returns: 是否成功 """ - key = f"task:{task_id}" - data = { - "status": status, - "meta": meta or {}, - } - return await self.set_json(key, data, expire) + if not self._connected or not self.client: + logger.warning(f"Redis未连接,跳过任务状态更新: {task_id}") + return False + try: + key = f"task:{task_id}" + data = { + "status": status, + "meta": meta or {}, + } + return await self.set_json(key, data, expire) + except Exception as e: + logger.warning(f"设置任务状态失败: {task_id}, error: {e}") + return False async def get_task_status(self, task_id: str) -> Optional[Dict[str, Any]]: """ @@ -161,8 +168,15 @@ class RedisDB: Returns: 状态信息 """ - key = f"task:{task_id}" - return await self.get_json(key) + if not self._connected or not self.client: + logger.warning(f"Redis未连接,无法获取任务状态: {task_id}") + return None + try: + key = f"task:{task_id}" + return await self.get_json(key) + except Exception as e: + logger.warning(f"获取任务状态失败: {task_id}, error: {e}") + return None async def update_task_progress( self, @@ -181,14 +195,21 @@ class RedisDB: Returns: 是否成功 """ - data = await self.get_task_status(task_id) - if data: - data["meta"]["progress"] = progress - if message: - data["meta"]["message"] = message - key = f"task:{task_id}" - return await self.set_json(key, data, expire=86400) - return False + if not self._connected or not self.client: + logger.warning(f"Redis未连接,跳过任务进度更新: {task_id}") + return False + try: + data = await self.get_task_status(task_id) + if data: + data["meta"]["progress"] = progress + if message: + data["meta"]["message"] = message + key = f"task:{task_id}" + return await self.set_json(key, data, expire=86400) + return False + except Exception as e: + logger.warning(f"更新任务进度失败: {task_id}, error: {e}") + return False # ==================== 缓存操作 ==================== diff --git a/backend/app/core/document_parser/__pycache__/__init__.cpython-312.pyc b/backend/app/core/document_parser/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 25edcb68fe9e86057a81e00569f6bb69335328aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2873 zcmaJ@U2GIp6u$Gbv;Vu@(!~NTl#~hs+CVTy2*Jc(P((u2$htZicBW<9+1+|)R@!Ds zia~87&^ASue~Lh;A@L_B0z$%*PrkJ7Lt!EhM0N`=x=@V?Po8^cX1gWeO?&UT=bU@* z-0ytn-2F8e^dV@`CBGzZ2?+f`CQjpRVI~Jc9w{h>6h>h+CdI~BhRB@8rT7>RGOxHa zS4xNpDR<0G=Yr-*d1GEGyER|RAM;b$qXkmISdhwIEtCq!!VF^3>qznKLyG?*Yn>Xa z=|D>0YbF-y4T_=c3!wFt4u4TPbN23qv!zqRrSUVxlli7+n@WeiEA8J~Ja=sR!U1r& zbM>dv*tO!dq3L7$EKlD(vZKhD{5ILxMaEZ>3F96^l&tA{N!HbEGS*dW`suh`)w7xb ze!llLy~i?<*(;gE>@4(_jJuS~?sUcOeW%B;CJAz$)7-W&a|47tQc;WnAlY{Tz8J?M zmA_~^JR-ZQ^uiNlx1(3s6GF_RdR3q5Z)X?4j%q;RHjpu>@TyO7fu2`{eU;NmPq^82m*kuY>HL^IJu*pOr26`h7{%8J#E{_aC0NQfQ zMO*Hy_P4E_E?cM?9NhP?In+t^eWZ1IA5p+G$2zC%;c}e*oZ)wTp0G#IvCodqxs{!G zBkWieCdVE}3Y+7Pqm#Vj@hOwz+K|X)mw{h3{H4Kfia&f+96oUO;HBcw;R^QIh2VJS z@&PNYAc?ATYJF3-4$LHyH0y|&CfoWZ(Sr%Nrl4or+mk(}OUvw5F%A(O*P$9FuO)Tp zyVPFY^t~r*S@l(nGgx$)Ttd?^xrfQA5KzI2r|H$R-Q5{%sESTP&_vq9H#e=1zYST3 zGo5O}h`$CA*SD*(($=dRs+@}NloMTQT8Ycu-SI>Qt8rjXHl?NwnZp-1PEbf-heKTfHD>Og2HaIMBW3XCC5FE z&N-%?Ndg(qF$WnS29vFY#nV?$-?`jxaiDbYd~xWk$l^vYm@XO&k;nBgvw|da?Ur$e zjtNn8@q5ME3DNC zq7;snRRi2mU@$P;mftb5WAuaHJWJ{I6V)NETzV5Mn^V2e`w~TC=s%x37Ybn$%FN9Z2cvetUwu*I7^QE+$QYFdsNm44KWTEa$W;><}PO&`4ej)Df2e2@uYmo*K-{w&O9qw>(R!Q#nA z{5%*4b#=nIGRH6s+>+t{5fHQB7J6zLiMLQQ{cE{}mi{ZOV8r_fx(Dwu9zVO+O*j1y D1n%{Q diff --git a/backend/app/core/document_parser/__pycache__/base.cpython-312.pyc b/backend/app/core/document_parser/__pycache__/base.cpython-312.pyc deleted file mode 100644 index f282ea155ed76656a23d0790fc6903da256e1c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmbUj?{8aI^}b*Bd(W}c)oyT-cJ-jN*vgNM4FM6Vw02@Go4l(1W->iq{GMB9{t@nb zrgfH%fHIM2Kaw)2ovN%ERiRZ2DSYV4BH$0;OQHfXPeLFqcDrxxTr_E)IOje4#dh-n zaV(#E?z!jPd+zyp|Kj({1mM=kcha*WAs^$U1wxZ(q<|<9jU zT!zmI2_frAc(UGvH!CJYo6l#YtelV;!jcz>Cd?7dbCY#;O!#b`7kHx1-sGCxo}v_$ z3*Ug5{NUGDYws^rm#pDYhRZ@vjNM^V*c> z@zs>5dFOw-PwGY?V-|X0N9WG>*WRnWe;F(ix4cFn znbZx#;x*M&EkUO=Pc0EHt0E)W@*aE(E+7Q0+;|yKiOeuFL;=cy8TK4wunb8P;4&_k zgIUvGgv{`5GEILGQY29(euJlIDC$QPK!oZ>1&cTIOlqe!167M4eE#CGvGG^V=1$Q3 zq@Fa#zn#wL#z|e(P8AJPSF__2YVtKbr;V#qQ{%}z)yK7bvXIqtrZR>0p&(%BBU437 zRFrfsZ7RxisLgUCEiP(kd37OUfRrkG24IjY;mD=H3UJ=> zH$awH9;%xKnoGJ?0VXPM+wyxrfGx=+jNJfS*LK@$z~#4REeg1v7QH=c%w_%*#Ioc3 zKi;an^UJNfA60)-s=j%bJ^^wzy1~%hKpUuFga!dyUNf&~5aQFpc0)9oVHA!50y}s} zcyDRu!VK7ywol~XI?^5Ko$u?Fr@4|@f<94aSQo-LnQe)184siO&=-%$lx zzG)<2rLziX>>Noz_Cpo$Ko#(&c&KyyO^`!Kh)uo(d=F-JbMAwz?{R7ctaxF?UlgN~ zB_Dxcww*=`X!P2}pVU6M>J~ev6n4a-o7WK#FOk!j!9Y2nVV1j*3%Sb1Eg$AfGk2g) zhK$10RGyl;rs(HPJ!e2MG%TN!TehdE9WmSCWxH-VxUH$1Vqb<+4GhLvQWBiEcZRa=8DkMg_`!#()j!R3$i!l=omKJ6NcGJ-TWc4a7GC^u?dP|*_daQ-e%JPG zDK*yA$tlV10dX1uy`!9+m-GTHQ{v|2=`-O?QkBeA9gw+RIP`o_Mdea=&>R)&&Inbut~mM@A%u;a0ga+65 z4X+1B)_X>vA@=XPA}vc57zURIH~V87{jq!fL(LBV-b@$Z9)|1Y z?W1>tw~yU;;}K4sWAUJP)Nku=aq2{pVp>tWgyk`dQ|a7kM_pTSEVuSM#qy$~GU*B1 z-Of#I0{)F T1kj_eevOfrg8v~f*!%q#Ydlxm diff --git a/backend/app/core/document_parser/__pycache__/docx_parser.cpython-312.pyc b/backend/app/core/document_parser/__pycache__/docx_parser.cpython-312.pyc deleted file mode 100644 index 5c1d8b0cb342b3ff603900da6d19de30dcf37977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5713 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

I65e}cjZM5A^@6STrZ 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 ONmLBA|A=rdj{kqrXz6PJ diff --git a/backend/app/core/document_parser/__pycache__/txt_parser.cpython-312.pyc b/backend/app/core/document_parser/__pycache__/txt_parser.cpython-312.pyc deleted file mode 100644 index 6f5c39baeb855ddd35f834a832243c2c0bf18ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8798 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 L_h*D_af$y2>z~bO diff --git a/backend/app/core/document_parser/__pycache__/xlsx_parser.cpython-312.pyc b/backend/app/core/document_parser/__pycache__/xlsx_parser.cpython-312.pyc deleted file mode 100644 index 2b8606e9373dac2e5abdf820fcd25d236b415b5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9524 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 diff --git a/backend/app/services/__pycache__/chart_generator_service.cpython-312.pyc b/backend/app/services/__pycache__/chart_generator_service.cpython-312.pyc deleted file mode 100644 index db6294de3cf8f435d0291042a240a2edf03cdfa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17853 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 diff --git a/backend/app/services/__pycache__/excel_storage_service.cpython-312.pyc b/backend/app/services/__pycache__/excel_storage_service.cpython-312.pyc deleted file mode 100644 index 91bd26381c0bd830c0707ddac55b69b8406a6ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19214 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 NJZ38iQE6nz|36hNs}%qM diff --git a/backend/app/services/__pycache__/file_service.cpython-312.pyc b/backend/app/services/__pycache__/file_service.cpython-312.pyc deleted file mode 100644 index 666b4d15b87f41632a0fad8485132ca6dd803cb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4975 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 N?Mg4*NCnL`{s&=IGYS9z diff --git a/backend/app/services/__pycache__/llm_service.cpython-312.pyc b/backend/app/services/__pycache__/llm_service.cpython-312.pyc deleted file mode 100644 index 1fb90dad2d28654ead9c09eb4be1e23d275f7bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9899 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 PX^F{lxOsnuG{}DgU$G=K diff --git a/backend/app/services/__pycache__/llm_service.cpython-313.pyc b/backend/app/services/__pycache__/llm_service.cpython-313.pyc deleted file mode 100644 index d802f0fd0412ff895506608d55840e8d7c45ad99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9750 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 DJ_oo% diff --git a/backend/app/services/__pycache__/rag_service.cpython-312.pyc b/backend/app/services/__pycache__/rag_service.cpython-312.pyc deleted file mode 100644 index 856ba0a75dae5d1dcacc37ae6541b9127f18affa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13101 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 L^IcDw$ddg(ofN(K diff --git a/backend/app/services/__pycache__/table_rag_service.cpython-312.pyc b/backend/app/services/__pycache__/table_rag_service.cpython-312.pyc deleted file mode 100644 index 22392986310dcccf432df65f2604f07e8c765a93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17869 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 F|9?6!jduV5 diff --git a/backend/app/services/__pycache__/text_analysis_service.cpython-313.pyc b/backend/app/services/__pycache__/text_analysis_service.cpython-313.pyc deleted file mode 100644 index 8bd287831deb4dd321d592f7baed2f2f96c957f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8841 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 F{|7raSVjN< diff --git a/backend/app/services/__pycache__/visualization_service.cpython-312.pyc b/backend/app/services/__pycache__/visualization_service.cpython-312.pyc deleted file mode 100644 index 4a0c83ca168f0fa0244ec66b23acebade1acbf76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19540 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

g2a;nbuH_;j}+ z7TjlBV}bdtkoDUT16j?`2uJsji&_*H>{du6^2H=ubWXs*;FUo9)&jV`&jN(!Q7FNa zwhKp`Cv8iXeJ(RKl(d?%;ISN_^>z<*5+TOPu~AOJu&#bMYG~XxkNGs|IUgS6!)lE8 z*gbeA>1OQ=rv*m&1oRrEB&YM>fSDbZLD12Gh>I!BJuY*n#cf-=hCP6f6F=|Z;e>gaD3C)`?`fH@qlu_XtP1=nabp%ZLv%q#~OC-8Z`L%6>dQ)YeaQy}n{f^0QTNGRnDX95r4k zn9Z-Adh)JPZp^r=RwLc2M!GeN(5+G!6OnG6*f>!&>3+X%>dE)kP66rq$gFPfTxKrt ztB~z;H!7B%-C4DBHTC{#b<NpTv1YVHV#6g>9CRlkGV@ zSssRFZke*v7r+i9iO%#CfcD-WHh1NiWNGH`Zs^FQDi8>{SW;LT3 z*IvV25S&j9H6+t6ihLi4W4aeL8H=1(nM82Y$;2RlelR>5*Cz;AIw_BZrbLVLi6SuG zJP}11030%zEJi+_od6u@-Xx+BOl@+Rym7;V_DkdS2_eSFvxHePUYRh8R4*Pd7CEoTOZrlor2wZ=VN_5KEOJ7xVLhgu*DvB<(|r1bb(ALb zJ>hxuLY&CI>V0XWXJfkx>bq}7P)-5`YGSH?u<+l*iQv z4=@24IqAt*cb>(vKSb|5dPA6~77xyl{RNEv8}xpJX&Qkowz(6akT}8u6k>-Vv#F4$ zH|21oX4ny|<05)UQj#M%Pp{If#o2A+WY8+7AXKY629gi}xw$j~m@v%4J@zt||1o+m zqW2Pd0rZ-{<78*-{ea(Wr#&1ET66PhPK_7xj@bQ}Z4|wi(K~|PLV#q-;LrUhFbS~{ zc?R|hhF$@Wlbi+xI6_~r5&)XQg)r5^0xt~gw;8(6sRqrit}f^_`zGe6$s@6UhZP({ z?>Kr5;JHztBrv`U7=&&}`vRCHzNX(`WyfI#0EHl5s?Lk%mqzldL;2O={MC{C`cQuT zL}xgEgMaV+_zR%UA;}YxNV{#O-4@R73bos&E#vKPWKJA>J?Gld$=aE!%`aF-N}ul< zX&>nvIuU4^$uaQ|C6v<=Y`6KFgV|kkS%%ByBaX0fML27vzbTrTJ-qh9+L0xJf=KC_ zQ0bbBDp4y_Gmy8SypiXpotv$_(%WD#9aNLMs+5{Qjc)9FE75vZCGs(l6U z7hJYJXxK2-7;HZhG+Pk8r5eED=#QVWG|^NsxN5+)~kJ^eOFwQ z(okhXD6e6%X=-<9)84uKqLG114I?X~`Q>A($(re$d74Vk`y(YyKPZ`(QN^2qoBwJU zG}_P{Y1kWT*gMHQ3fxie+AzuPaO=uOR`XUE_U(FPa7sq=E{8ke9 z8$Vw7bjbI3bxi4HnFy0;0*%Uq$^ja!@TGVvg!^P5l_~R>g!DvU`D2l}Br0j8FXgF} zK_x@337}{JU-Z-Kx8M3X&leF=Tf{?$Of>sTXob`DTRhetGnf=3e?dE4a0j$TkL#4x z(vLD4LR}8Kjdeqb0Vu(afpi<`aI??i#0~U5l)Dw;Yf-IHqk2E z)4vD=acKnaBp{^#Rvd>r3y}^_1*ImaImmN}NQdpfPLhWu7Shtreo)hZYK9PkfPTpI zAb=Q*A|19qK$<+vA>all)k1K?t44Yt{z0md7=I*;@1G#6`!xxVYnCOWkM1g{`c2{7 zP1kpgwU0Mkl@O1+r+VcxQdUH;v{+)dH+%wgjNfE0ipDQN`aEEy}CV3EygK*)l&cZRyj&gsL!BS#U)5FQLkvN(@LSgZ59 z&+Z;-i)1eiWiJh9npH|QiUVsX4 z(%|a8cMK%>7gJY2PGN51k{Qb1r_(`lDygx&7bQMuN)z=qKpMqmy+{@Llu(0KXf=L~ zA6I+vDHb^}QipkrPPh^pD2cY^Yt)mJ`~YmEN}$^kaEnKzr{YFvLa!KAjBZPk2c(_~ z=r#?WqJeHpk|Rd9sewlO|E*6NLha>}SFphIsu?XJ8Ne}doRFM$(?G7YI5P5x8mIW% z1*G)^L0ZYv4nUd?#s<*XV&~O*b^MoWfC5C)EiUC5J$W-yCLQRn3|}hD!ep332lb>d znU~~%q_VuJOm@<`a$r3;dC8OhjJ}U=0Of|kF;a#Qmf?4olmsIDL0wh{& z6-p96v01seG(722W*M_=+!XIWV7yiL=Sv{n^vrU=czSrdNys@7ldec0%2Y9;OzMLW zmA?TrVEI7CB~R!U{|z$QEKjH6h3VvEnrW3s#Zu<^e?>$XPER8^gQSx83vy>xY$06 z1JEXtSnM0<4WdWtc@{zg2w@U|;O$F`AB~5D&tS1{p|=p`L8o4USl(oXl)e4>+fboB z6($bLLK1+!*RY%qJ!}|?`~bt((Tk(R%w$F-F+NQMj9f-yF8BnNwVxg+fr=jVVnj4q z0OJl8F>y@EDeQfS$a!Y%ZR`w^(C}h-evRlI2MMLdf1ZIPEc*^-Aq*QyiZN`HnDiJX z$t<02_8;-~Mf3s~ry>9l={kZ>Nf|O~aj3~DK{Ls~H#`qu*Kj`bz4%`k5-}$ywfDhm zMu_Q-;m^~c^dxK>@M^J;#Lh{2*?-2qXprdR5h)A^^eF*>K8#+oL*X;4AF9Pnd^0hl zpfZ>Q?x$l!Tb(-ZBOtogU0C=02LH|*_p3Gmdm1hnM%Dy+CQeQ@P9GdHgwyx?8v(oJ z7)G+5KjLqWaa@KdHre?=w*~pGdsz7F-Y$Rojp2@5Fm(1z*-{ghz4hE0g5fAr9k6ZrIDuB9+ z(RHUM$|iHCYY1Jp4|**|my)P8_@MbCYkzcnNHS*tcJIZ)q3zLvl9yU8wgfC==>g{A z{-LHDD_2d>*Y-?i&aB)tnme_0XiqdNXL#3zT_f8^o&+<-y1*mR;-zD|C-+2`R01x~ ze!FA3d}i~$>ucd7Pax8=3xG(=J}$Ydri@DgSm%__XCSU7DEfXr@IG9el{>uY!lr;U zz|Mkc)Xu0*kJx!+%fybUvS}7o#BCS{@H?U_4(W==;NgnlEq!^taWxOAqm|3AIz}B= zoQZ_oW-9N5wq>YxgpXTb>7#>o%gLt)&~CzWiyyJT zhnX_3%u8%Z&%FX@N??6tJ}4oo$4D6DzK*YzqKJA-?GeupN!dNHt^`%0GGUBFzVANu zn8c@kN`3AoL#_$ZUqz%pZ<7hq4S)QBsG#`I16tW9phtHY@K`H&AoBhJE}XXC#-ct6 zjA6hcg*Sue&EnY>NFTrxK}?qwGxroeXH@fA6y!K~r3(>0`>|4*g-;`y1UYdCVojO^ zT4Dp1LX1fy0}>L&6anE+PXfdm@b_@_{xqk$(82u zCgAmL*G-ew>#L?}!Yi9X6-~jmu9@=gxr(J@x^P839Mvl`hEhhXGy1Z5EtR!m-bm>S zgQ|i*-%F#)4@v&~yYlY1t@oaVR^q|sTi=&WZGTTOc{*6UJECt1>05}I_#VmU?lmw3 z=V}@^O5ZJRT&4O&K@J3eQCrzqulZ$OCWL>vN{9YN^^RKlJ$c2BD*C-D8p77tDuLqg z@iF|99VUnDFbT|RVlI*u&c?B;PYO1cNmetzHwhd{2UNw=~)L zJ&`s4f-|@@*}4?^E}SrueTdG8?7mONXuUF6ukf+INjHEei<=YQP57mi5b|M_#F|^#Eja^FInf6w7Dm0Z&)e`ZGC51U3+B zxK+^lM!rugO&Y*$E>77v=&`w5_QPk?mXkKHC?nvMqpc2?8;siAHrol%Llbi~&@r!F zV{=+v3?zUdHv{HzzP8nE#`WW3MwtE# zbt6@OzV~eJ_Z@y&RHZ$yJ*$oC(xRDpQGI4KuQ-}(jOG+Za|)t)h4bl@I_pzPt=52@ zmRfgSeO5hGel8VDsm`i~($8tr+H<8hoLv*iULVR{KbafO-tN~# z)0d8E0^VTSnxJY8u~=?}gF*###FT@-e1Yc5@EaT&v$@a343OXB(3#EfS&}1`qBNTs zm(^@$k=tf*2@%4U#i3v~qKC&`b_II4RLG}7EFL{M1^hG$m`1axyJBtVp*ETAK@Wj1 zi+du`fWJzSuJOZ)Vvj{H7yjM9hJkyI`d4|`Cvqvh5lqvImfuybqfF-A~-Z^!Y8Oczy_Cez+vh4+-;!CCll&KrMcmG*3ZrvSQNx zrilcT7lJ(Vk4fsGmCn~3uR7)_2u>ZEF8{?55(H2iJoZG;!UVhQL5n?ftT)tt;vQz2 zcS^G9LUAl03}X=+Jtf{P9DR(b*3N>uvuCA)@SHG_sce1lJ6uAFB_m(@am7;!+H=>ir19$!j z0?$zl#Zrufk?xhS5^|NYQgW5CGPuh2%DZTm?ozOdE+wn%Qn9KoHLEsZ8TnpKR~DN^ z!qUB3Hk*{o>B?nw@whxTkHqD(1#qSJ7Ix`by@@)aH&e~=X26}yx>{^p@@l4z6gNwR zd$y#6GEuJ-?XJ5Dx9J%@S3!nUK{QAXz_+)%Sa|+tZj%?kmGgqPpv@E?V%(dqLJxCaBQ%bu*n zKH&5EIj7KQ!6)wqf_L)aS)QYgP|))f_B!;ql$A3wBgN7c6jQ>;k0_2PkEoiYG-PM! zBT7b*8q=g;lt${9{FsDQGpZvRYf)-7LYPq>(H>Ef@|r|wu@n`Pg;L=C{UtKAL`Dvi z4ehAN(2g9^dR=P!u~qO4xuj&?S173?CG+pu?!1&I&Qx5h@XpS(qCq6R4o-NVcK9exL|a2|EAe(s<}$}5K*tP3U>uX3G&>1p>J zw?{~92J#-u{IEy)#XMn?AGV#kC z!^8EQ(Cu9PiPV>2k4M)HpT;WOUbi2rD9`l5>cnIt2<5uKdz6|tR$MxDu`X&{8#b8uK9zemH>xTRtIEgvCl7{H z<+G~RJ0OkXHLg=mm&Z;zCEEdu(rM1k+5M-7;aORiKfrpOI0Qt8{X&MsC9?2TP&SD* zF)YMP@WLeZl(@`#W%tMFmG3@m(s3|%L!p^^j7nivYnTFunq z9gLzy>ZNV86{MuQUTi&aR&fCpBj8#uVU#Trt2QMn9<=5zjS~mASMe3=QhkNGlrZe` zmbT^aA)B%}{+7Hd$W!n+dDM_cpCQlJ67NjIsBJ2n+NSBnC4)E{El&27IGGs7XzCO- zR29{Ws|#^T%CV86yji_Cc8Rl=i=pI|$?B~X?`&D3v>d8Y%BUGFPFqHnDF==RPFhJZ z+1{-7teW_BKr%pWkyTOy5=&0tU68A}9(?@9k4ECl-J8D<6m>$g$91))ogL&_H70P$ z>CkHGz^P&Sy z&vfJG<2NpyO|0O6NUpv01EGFg&bWZn>Ebw^cCoAvmL=8%Wngtuy1h@;f{6p1yFl%yc%k^JADDKpVta467B*xI+DFf`uh4y zS3h~<$E_x)2Ub)ktZxIp9*d5b4Z8fibhw{a?}Qb&lXVQa_-t4)T~1g=alzqusdt!H zcmqRy&~y_vL*e&%5Hc0o2VGtl>+rkm$(HiEWUR29^To-S#Sb9!xV*d?Uns#|yu#xf z9E4h`u@)ITszuAGtypRGXv}Vu;Q4Wt7$u7r& z*nw;<7L>R+TuyLYiH^nj!RyKBIpeZBy#01jIk@%7=Kdpab-=cy!AFME6HD=WO?~_ zwN!rL`Ld_WM*G8gO~LI83aYXyT2U9SsC!5HuKG>&+U zjHFKLmD{8R)Goynx>l}f0= zM5zP-iuYg!^(#J8CbcW3iSiglo!YB7+|Q6bmyO1yWS6A7hN7}46J?VXP`hDsiK8iA zUqXQb0a*3b$gf6i|oMhcujQEyclH-VJaj0N{7{`ILT8 zi%*+unN1_c*`?i}Rq)+$GOxx9u%?bC?>8I!NqE2A|1-uQi`<$luC?q69s@t<5jjRcS*bV0k9_FBxvHKVjBl2fO7xuTOsKl zT-pkNZu#(lsho;{ixAz!)i9rxqJD4T0Ag`Z3ewPpw#EaWY_+I)S^zHcA(z9;D~4SC zZn%QZ@8@MhZU_xIPVusb8=Aq}(9A1`+#Kij4zk-o&>wM$zaBhq3gDV!iW59>fYZan zhLTqVyzYksE2b)KyZ)nKpy?!aVvz~giH z*_{w(JJ9PyZx?#I!Q)jA2OM5MY)N^!oAWy0Ap%3}dQ9Gc$;y)s){9LC+zoY|aCibP zp>_^Cj&W1kvy^06jd7$ctk)V|9m7h~zjg zIlaOYwO3Y;ufALtDO)#RQ9ZVOeAktp@t#OcQ>3Cf z*4TV?!{2YYy5;q)(+47rotK(P`O@*y%jI*W^)v1BrGi8f6Dh5~$9=SFUASu9WKE=M zL!@+LJX2a^rFpDje8ZK^49qIg9=z-oyXYZ>86Gx(J+QMtv zrXCKjX`i!f4>|hg@72!OwtdlU*6=p#+_r;rHMZGp2j7%WNnT9GT3dSV@I_ zVc(2P6FA@s6bW7f;<`=9bTATB1DSxJO(8DgCaN2zIjRuS203X1P`znwKtXBl3${W2 zrQ1MYNv~3@&L$Px$|wj>fOQ6XB?Ig{oG-K+YZUu2Qx7=`N$=2Kq-7b~p=^Bzz$$W^iA&FN2ZRqm$CzBE)g@s!u77@ks zrD9BqZ2M6VJLDL)C^N3Q;qyt0uaBr`vE_iA#z$RnYP=c0v*USvkRP zMY1Z#sv=p{q)ByQL)`>BZJu5iYUl{pch2O74nGjO{{eB!`rmR5*urmwb=6Vb%CK(b zMC+VxJuFt*TtU*hNLCGz)DkwdOqs*2-80{c80^6=EV-g#G>dX%*xuQs09CVq-_tVLOb(OV zA}6vkZ0Z;tlgH#U1@YQ4ZN>^2JyXOKV~&*mLHL;Fpnpmj1N<3@w2b_xEx~4bX{OXB zwb3a|r^ISV6A8Cs--&DAqWl?v`jY&~t&~KR!IY8p6KY!|?ayrT#FDVpDrYL{WK3n9 zu#GT@ErxAG9qON6vlwGtCWew%#zfvtRWB}k#3eP*l5K?9t7umYni+CUZXqny1S($- zUcCPHTQ@JhapQ+?0@G=c-omkR3y0s!z(0bGlXIVO-GU_^z-XVx;XHnGfVdl5KT}pW z_HAq!SZ|T@@;*1RkFNef7t9kM*jgN(;iC?O^l*0zS^Sr!yowk|K_0L2IQm?kVMl)e z)%UFz&jCvsAPXDtqt~ata|>5-km~dF-@*a+vW)#U#%NH&Ntb)@C|GKt_`#cv#6`C9 zlG86s*}o#i9AF>9!v3RR^Kl%52H+$G8Bby|ee$T=d6ZX^Cg9WEgjjH&ZjA>PwnEk* z#6VU%RKn9o$wi%5{@Lx2O7w+AmbMGP&Je6J!h!*)eaHa}=0i|IU||>cxWK}iR(vM2 zw3>P>h45G&FgknXCVYE*{_JY zY8W#;3?457dAt-hXBzj=pePczA4^r08}l#Etg6y=?5ilDUC>qXQgz9Ek>R}OY0t!l za8cvgU7%RBIZy36yKAKLeD}HTXZBB+rc_YGTG^F+=q=*at1YvTA(Q z2VP$_EqT2jc0WZ|jN``3Wpkx<(+}TP%8mKA)oP?s z)kvcj5*k$sJ(8eNCpS&5nc_ZZoPPNI_0vG6?w!-_n=dE^-W0NZ#vzye*v{geM(P8j zrXyeWK}}6Zw(Qs0G=vu^Go1WHnf(TU)pOLn%!cCfmjf!-%VbA}r5=EB zTorcMWSK0*!09MBFhCMU2R6^JG$xc;Z$fD$mp^fdW#nXW233?P7eh00Ih-CqX@e&4ZXP;`tE6*Q>ftQLh=4JGwrUnQ?e zRu5D!ZAHUJnzJbvsb@Nq@&hn{=Y4cUq0$+7DLlKA%#l!b$;ybr$pfxAa57IJcKLPz!g-g z227XV8+xi%iwQ$92~7n&jCG>U=h7J zOf7(;9GF?SMM!gEYhi}v9?~UPQvgHQFWy|QE@fWiitSE$7M&OeyeW(rY(4O%I&Uts z0$~l|D5YM-fDj@ngsp^)xZvVoC$AT^3~^Q@wbC48A!Bc4N^A1OnwNkb+MCy&H%K$& zngVuKrGT9qe>;BtmoEa?VZQ}cS)}ZD;KKUR3!wL1@OnOz)z#Gj!dbVruVv%9!RIfa zyS0@)1&MK(@bOlQoc$)2K-9rL0v>=0x7T&j-S0no3k`of&7$VLrGoIwGG4{{(0mKL zqZCfHd>czW3Le2g0Dx}&%~Js#+@p;eFpz1*LEo@x-CB##z`w@qxPLpyp2gr3=zR~p z@1yqv^qxX*1U-0#)ZjM?f41x2&O9sP8fqIHr-2hRE|ymSIP&|3-~oOC8F}f6cys;+ z%RYnNv*AUyNupT==~TynBo9V z&bWsGk-1L!c^VAc_EWqXFXSDuR?PMj^sbs1>(8wpT^6ls3Rg8v?U`XhN1P!aJF-4h zzy)`H97k%)=CmfjSW#_7SX(iAVp2MJawac?cY6_feF-oZTCp)?Xqny~V(t&w9SG<8 zz6hLyr!TIK7FohYmT1wMaM7AbQ9an_Eo&#&y;3@Ia;)&_Z%$PQch3XgTN7QeDZFCS z?%O_xp1F$sv#mW>YbL8E z4_xBL)?GaD5;w8#@`>la8E);Ft=NBCO(T4yvvdCRhi0m1Q1Yico2knCB%fZ(#Ws8i zD2WD)$J%APS5oiMZM!Swzmjz{!OcHzFz>F>&KPJ2&s1iizf!ZuESqVn*;6k2u$+c4 zYl5(34j8QKj2d`8o?9_;3$zj6EuP| zdEdY%0!W&Lr@2H^DD)8YY`P<$6IdYvL*$u&DU+LEh2+p)c_v^Ay-au^l=6A40|}++ ztw{1Z0^|hFNT@3VfF+RAAb`%4x=>4}IT&SX_^V(l;~=XlEd$&p!M|6FY>Z9IRMp86 zpob zreLG*LN)@B((%z%O!zr^1RuSDp(JJ^a4Cs)R3c#y%nkuNCd_^jycB?QQ|#Zw89IFm zpc#YAyb|OfgTua$<#F}FLv()ofWsN5$Ova6&}1Yf0UhytvVS-Y((t(iy`7C%8I4*&TR$Nyg5?5`RBVPn9;@y$`^7j zeqOs9|Ps=-_^)&cfjxI3SFE_X~e zr>jY(?D(B-1sFN1?vvcnQe{1o5#_wD;JoT-)oA{O(n-kM1S%Zj0YYTw5~#9l!aT_$ z%hZa{1JAk{8mIbZ4u$UTML;op=T9mXY@P zN|G|tA%JsK37mr@SPBy9O=#yNStPcMQ6)&Q47otZselC2AUgphScV)aB$yh=t^Z%! zrXj>zCUOk0j6jdY=_&(xaf>`4kg~zH1&F6NfiIHp7_igVp}({4k=6rgTIiRuMIy<~ z;dg{jxj^eDNV23>XLRJvz({BEfV#@}=D--rfHMyN)|Sl_3T-)zKBKIngsfta zh18o0@Y{U?{_E}&t{}g9X)6g8S4_w_L{4-@YZD+L=pz$BY00^{e5o|RkS?YQzU#=f zEx^k(Ej4j9p!b<{gC|UdJr6mEk)iNvK&l1ON^-J@lkYhS# zCEzw4yuA!08tQ9w%&HVBOBJWGq+STYvAYH#4@JfCU0!dK7-Pk4Qkr8{r_8Zb3TrXG zQxggc5GY<#@ZB2nJ(y^(o4Wqp*Ka&}<>q&Odi{xu1n99G)F&XE0EBpjwSRlS&hm0c z!0)^Df4~u|722nqaO40^FmS_gq@S0cz{7RmJ5CYI)x-W21!VwDfY82;Nw1-Jw4wo% zgnZZ;SzW^bJB3NFqjwrTq^sZ?0UtZ$@Bo7R1;)LF9%0Og93-0p2*6Xp-OY>Xk0wC8 zB)VG+-Jnq~qa0keg|atae;Wk4b6}ZfPeLpJx&H(g_A&IZVkq)7hW{SDB=RfBbTA{% zc$qLOf#kpx@zCNfIaW3ilAAY=QfF4{N{?3ok}sz=*By zG$Fmn&Y3_u_E(sNa9|`U&Vl^{md0%jFLU&9><4&z89fAvyo!K2B-9AzBxOjiCE+8l z1Z!YFd;oI~{;LIrnb5n7UIIt*Quh$NW`vDg98;bGLnGnCfcc7tByL`EjQwXQ$!m~` z6Hq2}2(&2$RsJ~wYzPal{j-+C)Hf49SYw7kz@3C;1F5h^b;-v-Mr}B^;hC1;&THxB zL_m~=bB58Tv7?hGrnk==7%_zM_6N5EE-NyO7Cv)-urtm>T{6F5dEPSC2@Kbqc6G)` z0D=!m`Xtc@-Lnt6BgMzS4;{Myje<9rse;!Jzg|9_A6d8Kl5BLxMb%irn0YjNf}Sl| z^G^jc%x_C(OAdq|bR)_=7JJa~mx=&-El#POnlw)p&#WVqS~s*h5nV;1n(#qON7w)G z!4b*40T{R+m5;Q?%1kfpxv*!)(E0rW&yJ)%Ea=BhX#?GN79D4@&N+DPt`F=A!C_ ze8kHH9WUkUmf+pO;`5uI-aIA^!?B{BF|7^}@o3xRj%o7@iw0RM#sR2~YAeIq$_aQZ zxUT-Fy>^FKE z!i!KeB2|K-@4|>CryOO(tS2RB8(#t(B8Sfm3ISqgJmDznGcVnXQi!u94Yl}fBo<9` zVky9%N$suJD1}rE~^nPN80D2!* zY_GaEu~W!o{$&(4IhgyDDZQ28>6RF3!gRYV$tRUM^NA#h;X!AIBL%BgY)z6MDaO$ynt3G-r?5}hE}eP};ezdY$i4-I5WG6@2U zfG~<*oq4TKd|#M)LZ7=I*Ll=Tu+D2KLuoMkW&BrrY0FOq~i< z?vCpA%0WZ7gePo;3WSQ|iu zc75{kl%Ezc0s01e@+ZH1^~U#Kyf*cgNjOtwy8hGiH(&k9wW*)Oi7xNpEda~)SXZ29~CZSEMEgHaUK3=)~wBN<;*$>|!J5IRZ^cDf7Jni)O zI5*U55Wx+4+X`J ziF^eU?{VBK{SewPPT@zOz@yZ)9NkmLo;dbBPf!+9Wj&R3HY=vhjTMx{bOo`J%2=^6 zR#YAkk^ceaP1zAU`&twcFu4A5T0b7k`9;<>1$5ye_W~e~ZFy@AoldAHUQe8-iJbm9tt0@hj)MdE~YQES(5o7i231?IX@&U9FnZ0OU4@TGob|vf>Sk9 z+?y5>%v=caEF6|JLoI!;d0zG`P!OCxI8*)J{UitoICSLeAxD2`z#Ve9!$*#Vnd5gc z(}Gu`r^^$40b%Hic<(9kF17dXsxhWcM>kK%{+)u0@S5@ET1wekc(rT^dgb8pO8j;n zJ~M-_^G^@s=VoLKlHo_j8yQ_nD2hL=;y(&MlO+6{3jB78x8K2$;R#>JC4NK+eg_3D z8t~gH`Kg4in&U#ylS&B4cplDkO2QE?ji8t6D5h{wp1#S-%(H!%|}%BM^w(g zQjPzGYWx?fj^)HIFL(UE!uB W&9^DyKafQk) { - const { user, profile, signOut } = useAuth(); const location = useLocation(); - const navigate = useNavigate(); - - const handleSignOut = async () => { - await signOut(); - navigate('/login'); - }; const SidebarContent = () => (

@@ -70,25 +60,17 @@ const MainLayout: React.FC = () => {
-
+
- +
- {((profile as any)?.email) || '用户'} - {((profile as any)?.role) || 'User'} + 智联文档 + 多源数据融合
-
); diff --git a/frontend/src/pages/Documents.tsx b/frontend/src/pages/Documents.tsx index 283b39c..b81e564 100644 --- a/frontend/src/pages/Documents.tsx +++ b/frontend/src/pages/Documents.tsx @@ -9,19 +9,43 @@ import { Clock, ChevronDown, ChevronUp, - Database, FileSpreadsheet, - File + File, + Table, + CheckCircle, + AlertCircle, + Loader2, + Sparkles, + TrendingUp, + Download, + Brain, + Settings2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; -import { Card } from '@/components/ui/card'; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; -import { backendApi } from '@/db/backend-api'; -import { format } from 'date-fns'; +import { Label } from '@/components/ui/label'; +import { Switch } from '@/components/ui/switch'; +import { Textarea } from '@/components/ui/textarea'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Checkbox } from '@/components/ui/checkbox'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; import { Skeleton } from '@/components/ui/skeleton'; +import { backendApi, type ExcelParseResult, aiApi } from '@/db/backend-api'; +import { + Table as TableComponent, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table'; +import { Markdown } from '@/components/ui/markdown'; +import { AIChartDisplay } from '@/components/ui/ai-chart-display'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'; +import { format } from 'date-fns'; type DocumentItem = { doc_id: string; @@ -41,8 +65,55 @@ const Documents: React.FC = () => { const [documents, setDocuments] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); - const [expandedDoc, setExpandedDoc] = useState(null); + // 上传相关状态 const [uploading, setUploading] = useState(false); + const [uploadedFile, setUploadedFile] = useState(null); + const [parseResult, setParseResult] = useState(null); + const [expandedSheet, setExpandedSheet] = useState(null); + + // AI 分析相关状态 + const [analyzing, setAnalyzing] = useState(false); + const [analyzingForCharts, setAnalyzingForCharts] = useState(false); + const [aiAnalysis, setAiAnalysis] = useState(null); + const [analysisCharts, setAnalysisCharts] = useState(null); + const [analysisTypes, setAnalysisTypes] = useState>([]); + + // 解析选项 + const [parseOptions, setParseOptions] = useState({ + parseAllSheets: false, + headerRow: 0 + }); + + // AI 分析选项 + const [aiOptions, setAiOptions] = useState({ + userPrompt: '', + analysisType: 'general' as 'general' | 'summary' | 'statistics' | 'insights', + parseAllSheetsForAI: false + }); + + // 导出相关状态 + const [exportDialogOpen, setExportDialogOpen] = useState(false); + const [selectedSheet, setSelectedSheet] = useState(''); + const [selectedColumns, setSelectedColumns] = useState>(new Set()); + const [selectAll, setSelectAll] = useState(false); + const [exporting, setExporting] = useState(false); + + // 上传面板展开状态 + const [uploadPanelOpen, setUploadPanelOpen] = useState(true); + + // 获取分析类型 + useEffect(() => { + aiApi.getAnalysisTypes() + .then(data => setAnalysisTypes(data.types)) + .catch(() => { + setAnalysisTypes([ + { value: 'general', label: '综合分析', description: '提供数据概览、关键发现,质量评估和建议' }, + { value: 'summary', label: '数据摘要', description: '快速了解数据的结构、范围和主要内容' }, + { value: 'statistics', label: '统计分析', description: '数值型列的统计信息和分类列的分布' }, + { value: 'insights', label: '深度洞察', description: '深入挖掘数据,提供异常值和业务建议' } + ]); + }); + }, []); const loadDocuments = useCallback(async () => { setLoading(true); @@ -62,49 +133,68 @@ const Documents: React.FC = () => { loadDocuments(); }, [loadDocuments]); + // 文件上传处理 const onDrop = async (acceptedFiles: File[]) => { + const file = acceptedFiles[0]; + if (!file) return; + + setUploadedFile(file); setUploading(true); - const uploaded: string[] = []; + setParseResult(null); + setAiAnalysis(null); + setAnalysisCharts(null); + setExpandedSheet(null); + + const ext = file.name.split('.').pop()?.toLowerCase(); try { - for (const file of acceptedFiles) { - try { - const result = await backendApi.uploadDocument(file); - if (result.task_id) { - uploaded.push(file.name); - - // 轮询任务状态 - const checkStatus = async () => { - let attempts = 0; - while (attempts < 30) { - try { - const status = await backendApi.getTaskStatus(result.task_id); - if (status.status === 'success') { - toast.success(`文件 ${file.name} 处理完成`); - loadDocuments(); - return; - } else if (status.status === 'failure') { - toast.error(`文件 ${file.name} 处理失败: ${status.error}`); - return; - } - } catch (e) { - console.error('检查状态失败', e); - } - await new Promise(resolve => setTimeout(resolve, 2000)); - attempts++; - } - toast.error(`文件 ${file.name} 处理超时`); - }; - checkStatus(); + // Excel 文件使用专门的上传接口 + if (ext === 'xlsx' || ext === 'xls') { + const result = await backendApi.uploadExcel(file, { + parseAllSheets: parseOptions.parseAllSheets, + headerRow: parseOptions.headerRow + }); + if (result.success) { + toast.success(`解析成功: ${file.name}`); + setParseResult(result); + if (result.metadata?.sheet_count === 1) { + setExpandedSheet(Object.keys(result.data?.sheets || {})[0] || null); } - } catch (err: any) { - toast.error(`上传失败: ${file.name} - ${err.message}`); + } else { + toast.error(result.error || '解析失败'); + } + } else { + // 其他文档使用通用上传接口 + const result = await backendApi.uploadDocument(file); + if (result.task_id) { + toast.success(`文件 ${file.name} 已提交处理`); + // 轮询任务状态 + let attempts = 0; + const checkStatus = async () => { + while (attempts < 30) { + try { + const status = await backendApi.getTaskStatus(result.task_id); + if (status.status === 'success') { + toast.success(`文件 ${file.name} 处理完成`); + loadDocuments(); + return; + } else if (status.status === 'failure') { + toast.error(`文件 ${file.name} 处理失败`); + return; + } + } catch (e) { + console.error('检查状态失败', e); + } + await new Promise(resolve => setTimeout(resolve, 2000)); + attempts++; + } + toast.error(`文件 ${file.name} 处理超时`); + }; + checkStatus(); } } - - if (uploaded.length > 0) { - toast.success(`已提交 ${uploaded.length} 个文件进行处理`); - } + } catch (error: any) { + toast.error(error.message || '上传失败'); } finally { setUploading(false); } @@ -114,11 +204,176 @@ const Documents: React.FC = () => { onDrop, accept: { 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'], + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['.xlsx'], + 'application/vnd.ms-excel': ['.xls'], 'text/markdown': ['.md'], 'text/plain': ['.txt'] - } + }, + maxFiles: 1 }); + // AI 分析处理 + const handleAnalyze = async () => { + if (!uploadedFile || !parseResult?.success) { + toast.error('请先上传 Excel 文件'); + return; + } + + setAnalyzing(true); + setAiAnalysis(null); + setAnalysisCharts(null); + + try { + const result = await aiApi.analyzeExcel(uploadedFile, { + userPrompt: aiOptions.userPrompt, + analysisType: aiOptions.analysisType, + parseAllSheets: aiOptions.parseAllSheetsForAI + }); + + if (result.success) { + toast.success('AI 分析完成'); + setAiAnalysis(result); + } else { + toast.error(result.error || 'AI 分析失败'); + } + } catch (error: any) { + toast.error(error.message || 'AI 分析失败'); + } finally { + setAnalyzing(false); + } + }; + + // 基于 AI 分析生成图表 + const handleGenerateCharts = async () => { + if (!aiAnalysis || !aiAnalysis.success) { + toast.error('请先进行 AI 分析'); + return; + } + + let analysisText = ''; + if (aiAnalysis.analysis?.analysis) { + analysisText = aiAnalysis.analysis.analysis; + } else if (aiAnalysis.analysis?.sheets) { + const sheets = aiAnalysis.analysis.sheets; + if (sheets && Object.keys(sheets).length > 0) { + const firstSheet = Object.keys(sheets)[0]; + analysisText = sheets[firstSheet]?.analysis || ''; + } + } + + if (!analysisText?.trim()) { + toast.error('无法获取 AI 分析结果'); + return; + } + + setAnalyzingForCharts(true); + setAnalysisCharts(null); + + try { + const result = await aiApi.extractAndGenerateCharts({ + analysis_text: analysisText, + original_filename: uploadedFile?.name || 'unknown', + file_type: 'excel' + }); + + if (result.success) { + toast.success('图表生成完成'); + setAnalysisCharts(result); + } else { + toast.error(result.error || '图表生成失败'); + } + } catch (error: any) { + toast.error(error.message || '图表生成失败'); + } finally { + setAnalyzingForCharts(false); + } + }; + + // 获取工作表数据 + const getSheetData = (sheetName: string) => { + if (!parseResult?.success || !parseResult.data) return null; + const data = parseResult.data; + if (data.sheets && data.sheets[sheetName]) { + return data.sheets[sheetName]; + } + if (!data.sheets && data.columns && data.rows) { + return data; + } + return null; + }; + + // 打开导出对话框 + const openExportDialog = () => { + if (!parseResult?.success || !parseResult.data) { + toast.error('请先上传并解析 Excel 文件'); + return; + } + + const data = parseResult.data; + let sheets: string[] = []; + if (data.sheets) { + sheets = Object.keys(data.sheets); + } else { + sheets = ['默认工作表']; + } + + setSelectedSheet(sheets[0]); + const sheetColumns = getSheetData(sheets[0])?.columns || []; + setSelectedColumns(new Set(sheetColumns)); + setSelectAll(true); + setExportDialogOpen(true); + }; + + // 导出处理 + const handleExport = async () => { + if (selectedColumns.size === 0) { + toast.error('请至少选择一列'); + return; + } + + if (!parseResult?.metadata?.saved_path) { + toast.error('无法获取文件路径'); + return; + } + + setExporting(true); + + try { + const blob = await backendApi.exportExcel( + parseResult.metadata.saved_path, + { + columns: Array.from(selectedColumns), + sheetName: selectedSheet === '默认工作表' ? undefined : selectedSheet + } + ); + + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `export_${selectedSheet}_${uploadedFile?.name || 'data.xlsx'}`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + toast.success('导出成功'); + setExportDialogOpen(false); + } catch (error: any) { + toast.error(error.message || '导出失败'); + } finally { + setExporting(false); + } + }; + + const handleDeleteFile = () => { + setUploadedFile(null); + setParseResult(null); + setAiAnalysis(null); + setAnalysisCharts(null); + setExpandedSheet(null); + toast.success('文件已清除'); + }; + const handleDelete = async (docId: string) => { try { const result = await backendApi.deleteDocument(docId); @@ -148,12 +403,35 @@ const Documents: React.FC = () => { } }; + const formatFileSize = (bytes: number): string => { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`; + }; + + const getAnalysisIcon = (type: string) => { + switch (type) { + case 'general': return ; + case 'summary': return ; + case 'statistics': return ; + case 'insights': return ; + default: return ; + } + }; + + const isExcelFile = (filename: string) => { + const ext = filename.split('.').pop()?.toLowerCase(); + return ext === 'xlsx' || ext === 'xls'; + }; + return (

文档中心

-

上传并管理您的非结构化文档(docx/md/txt),系统将自动进行深度理解与信息提取。

+

上传文档,自动解析并使用 AI 进行深度分析

- {/* Upload Zone - For non-Excel documents */} -
- -
- {uploading ? : } -
-
-

- {isDragActive ? '释放以开始上传' : '点击或拖拽文件到这里'} -

-

- 支持 docx, md, txt 格式文档,系统将自动识别关键信息并存入 MongoDB -

-
-
- - Word 文档 - - - Markdown - - - 文本文件 - -
-
- - {/* Filter & Search */} -
-
- - setSearch(e.target.value)} - /> -
-
- - {documents.length} 个文档 -
-
- - {/* Document List */} -
- {loading ? ( - Array.from({ length: 3 }).map((_, i) => ( - - )) - ) : filteredDocs.length > 0 ? ( - filteredDocs.map((doc) => ( - -
-
-
- {getDocIcon(doc.doc_type)} -
-
-
-

{doc.original_filename}

- - {doc.doc_type} +
+ {/* 左侧:上传和配置区域 */} +
+ {/* 上传卡片 */} + + +
+ + + 文件上传 + + +
+ 拖拽或点击上传文档文件 +
+ {uploadPanelOpen && ( + + {!uploadedFile ? ( +
+ +
+ {uploading ? : } +
+

+ {isDragActive ? '释放以开始上传' : '点击或拖拽文件到这里'} +

+
+ + Word + + + Excel + + + Markdown + + + 文本 - {doc.metadata?.columns && ( - - {doc.metadata.columns.length} 列 - - )} -
-
- - - {format(new Date(doc.created_at), 'yyyy-MM-dd HH:mm')} - - {(doc.file_size / 1024).toFixed(1)} KB
-
- - -
-
- - {/* Expanded Details */} - {expandedDoc === doc.doc_id && ( -
-
-
-

文件信息

-
-
- 文件名 - {doc.original_filename} -
-
- 文件大小 - {(doc.file_size / 1024).toFixed(2)} KB -
-
- 文档类型 - {doc.doc_type.toUpperCase()} -
-
- 创建时间 - {format(new Date(doc.created_at), 'yyyy-MM-dd HH:mm:ss')} -
-
+ ) : ( +
+
+
+ {isExcelFile(uploadedFile.name) ? : }
- - {doc.metadata?.columns && doc.metadata.columns.length > 0 && ( -
-

表格结构

-
- {doc.metadata.columns.map((col: string, idx: number) => ( - - {col} - - ))} -
- {doc.metadata.row_count && ( -

- 共 {doc.metadata.row_count} 行数据 -

- )} -
- )} - -
-

存储位置

-
- - - {doc.doc_type === 'xlsx' ? 'MySQL 数据库(结构化数据)' : 'MongoDB 数据库(非结构化文档)'} - -
+
+

{uploadedFile.name}

+

{formatFileSize(uploadedFile.size)}

+
+ + {isExcelFile(uploadedFile.name) && ( + + )}
)} -
+ + )} + + + {/* Excel 解析选项 */} + {uploadedFile && isExcelFile(uploadedFile.name) && ( + + + + + 解析选项 + + + +
+ + setParseOptions({ ...parseOptions, parseAllSheets: checked })} + /> +
+
+ + setParseOptions({ ...parseOptions, headerRow: parseInt(e.target.value) || 0 })} + className="bg-background" + /> +
+
- )) - ) : ( -
-
- + )} + + {/* AI 分析选项 */} + {uploadedFile && isExcelFile(uploadedFile.name) && parseResult?.success && ( + + + + + AI 分析 + + + +
+ + +
+
+ +