From a1def533afd44c9a859ce47580bd7acd9fae6ecc Mon Sep 17 00:00:00 2001 From: zhaoying Date: Wed, 24 Dec 2025 18:09:02 +0800 Subject: [PATCH 1/2] feat(web): order --- web/src/api/order.ts | 17 + web/src/assets/images/menu/pricing.svg | 22 + web/src/assets/images/menu/pricing_active.svg | 22 + web/src/assets/images/order/alert.svg | 13 + web/src/assets/images/order/bg.png | Bin 0 -> 35926 bytes web/src/assets/images/order/biz.png | Bin 0 -> 3756 bytes web/src/assets/images/order/check.svg | 15 + web/src/assets/images/order/commerce.png | Bin 0 -> 2082 bytes web/src/assets/images/order/corporate.svg | 15 + web/src/assets/images/order/order.svg | 16 + web/src/assets/images/order/order_hover.svg | 16 + web/src/assets/images/order/personal.png | Bin 0 -> 2007 bytes web/src/assets/images/order/team.png | Bin 0 -> 2033 bytes web/src/components/SiderMenu/index.tsx | 4 + web/src/components/Table/index.tsx | 6 +- web/src/i18n/en.ts | 122 +++++- web/src/i18n/zh.ts | 122 +++++- web/src/routes/index.tsx | 3 + web/src/routes/routes.json | 3 + .../OrderHistory/components/OrderDetail.tsx | 76 ++++ web/src/views/OrderHistory/index.tsx | 227 ++++++++++ web/src/views/OrderHistory/types.ts | 43 ++ web/src/views/OrderPayment/index.tsx | 391 ++++++++++++++++++ web/src/views/OrderPayment/types.ts | 27 ++ web/src/views/Pricing/index.tsx | 281 +++++++++++++ 25 files changed, 1437 insertions(+), 4 deletions(-) create mode 100644 web/src/api/order.ts create mode 100644 web/src/assets/images/menu/pricing.svg create mode 100644 web/src/assets/images/menu/pricing_active.svg create mode 100644 web/src/assets/images/order/alert.svg create mode 100644 web/src/assets/images/order/bg.png create mode 100644 web/src/assets/images/order/biz.png create mode 100644 web/src/assets/images/order/check.svg create mode 100644 web/src/assets/images/order/commerce.png create mode 100644 web/src/assets/images/order/corporate.svg create mode 100644 web/src/assets/images/order/order.svg create mode 100644 web/src/assets/images/order/order_hover.svg create mode 100644 web/src/assets/images/order/personal.png create mode 100644 web/src/assets/images/order/team.png create mode 100644 web/src/views/OrderHistory/components/OrderDetail.tsx create mode 100644 web/src/views/OrderHistory/index.tsx create mode 100644 web/src/views/OrderHistory/types.ts create mode 100644 web/src/views/OrderPayment/index.tsx create mode 100644 web/src/views/OrderPayment/types.ts create mode 100644 web/src/views/Pricing/index.tsx diff --git a/web/src/api/order.ts b/web/src/api/order.ts new file mode 100644 index 00000000..e5d9d916 --- /dev/null +++ b/web/src/api/order.ts @@ -0,0 +1,17 @@ +import { request } from '@/utils/request' +import type { VoucherForm } from '@/views/OrderPayment/types' + +export const getOrderListUrl = '/v1/orders/customer' + +// 提交支付凭证API +export const submitPaymentVoucherAPI = (voucherData: VoucherForm) => { + return request.post('/v1/orders/', voucherData) +} +// 订单详情 +export const getOrderDetail = (order_no: string) => { + return request.get(`/v1/orders/customer/${order_no}`) +} +export const orderStatusUrl = '/v1/order-status/' +export const getOrderStatus = () => { + return request.get(orderStatusUrl) +} \ No newline at end of file diff --git a/web/src/assets/images/menu/pricing.svg b/web/src/assets/images/menu/pricing.svg new file mode 100644 index 00000000..5510ba23 --- /dev/null +++ b/web/src/assets/images/menu/pricing.svg @@ -0,0 +1,22 @@ + + + 菜单-收费管理 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/menu/pricing_active.svg b/web/src/assets/images/menu/pricing_active.svg new file mode 100644 index 00000000..f708877d --- /dev/null +++ b/web/src/assets/images/menu/pricing_active.svg @@ -0,0 +1,22 @@ + + + 菜单-收费管理 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/alert.svg b/web/src/assets/images/order/alert.svg new file mode 100644 index 00000000..18e9fd5c --- /dev/null +++ b/web/src/assets/images/order/alert.svg @@ -0,0 +1,13 @@ + + + 注意 + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/bg.png b/web/src/assets/images/order/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..da821814320014bc74b24a19d13b2649750cc350 GIT binary patch literal 35926 zcmaI830RY7_BKBA6-TH)l_e~Vf)YVMwxJ_PS+oHo0tK=FVM~|>tr7$#qfunhDPqmS z;(}1iB0C8op+O=s5}3A0oR&{;c>^>>oOv@H+82>Yoj{7)cY>Yy{r=bYzrO3zfPp0M z`#k5|=RWtjANl0uxQ%b)-~QFFezh_F;C||_eq{&W{^~Ebzkx?}#a!~QepT%rzn_@u z_Rf$ejRc6{hmXFxNmF{2Y=_dyZz#yw!TL` z+QcHfFR14wEdE*U`SMq9eT04b@%z-D8-R#xr%vDgxN zcKgCo!I`)hVP|Tu|7}{GUUQ|iU?9x z*}kMZ+ z`0>NfM>;bo1j1fL&t7NGpgxn9YWO&?-;W2Tq??l`Fuv>mfIh+ zLzc+6roAfW?9VyC8u1VdkLDb>U)qF)CZ?88ZoF~)LlZjQKDpL{f@j_PB>$)Ox6*gryAWS3WbjefS9 zdEHX0|F-gz@F3kS7gs8J*el5M;8s1kk=(nV*NJa*K>t^aaVR{O_Yi;QJkFGfFB9Jl z3>17v^{TJZ%wg}itfyXxarN;|W^Z++YB+nAKhs}v^aFB=`p`0D~)$FQ2>pNVsbdG$&)0ZRKMB?2DZLKeDGl^#S zu){cSCD=;|Hs!cW@nQ z#(lGjXn0>Tk>yeGf5hm&o=-e2tE(|b zxWP{zUm@4U^Al|y<3iJdcf@SfE355Y?eV?ZpJSS*!h^balMiMR3ybn8vkioHFR$hF z$cdF96yeCt>1Ka3GL^Y_-L(|-1Q6>hpy zF+XORewmAm{WSU0%HFTgTdyd^FH&CizM6ad*Ie|7j8Z7*@creF0U7rbG$?SSNB)A2 zb`zO`BekR=>kwvQ;(|od>r8?tD2=o-qQKd|h+agWBH$EuD0x;`7BV*yffG1~{&Ep( zSCUsvwAWae`W4A0y>iHaBSoj;xY5{<_2XoZCN*P2{b!8>MX$wYA8(n&O`3dO1}?n_ zJu{uxQ2M({Ll?p+c%pakPneY?CH%q3WiTLMgD3H5`R6K{H#hZ(=HqZ&(@bV_{meLf zK+))U0RoCgD}hQYzArv3D}vD{mMXIB#8vWu0BA1cq! zWZGt}XFK6c6wP~hpKgz%TLo%mTX=51`cs6{jdA>miNcHLXY7cVzPbIEBwn4$&G;?$ zE?U^PAv5P1K2CGkOSf=I#nTV}u*!p)gcj#97-h2;H zIl_h9czmD`-rtC|cQ6N(MI_3!ShPU-pC87i?OVP*_jAgt!Lj+O@PACM)@gJ9=2M%A z;RDS-e~F!|ipX`B8<4rdi}poxo?go;a-_H~5AU@}V?>!~{fymR?B|%R8IGr>`db4X zuJh{f+eqcRgjdp=ylo2=ibmD(8?y(=^`mj7*hjCv+T3sP?BAOqN{XttM|S$6PVFJ1 zgC!!5gYNXcRvgkk!%tcaRPrPD>{%{a)Fks;63RahC$F%oAwJJ(x1<$Q9E&N&kC8nO zmDLUSIIYkZBcNoq6Wa&DXmav;>UxzyGAkQ;s{W)u?NTOH>m(GPZsrHK zBl4x{su{l5UcF3q;J)(Hh}?y)Am#@PTjjLP=Ob{D+|(^t1d<$`sJ=+O6H1tCCO1OJ zp9~!xJ;brA5gughH@=J3^aVRz0POvW6?NG3KK4Fb(8oQR@q;6x@SxWAAW!ew#F!|y zBEK0IY5F6oy!W5-*tLC=^vvI*)qx6e%Z#uN9nyV_#O|rxz{zr5kH1jK;-tFVIUin_ zR3QtHyKW0j&fe;(iRT+#s8y@)*4(AWohL;d-dMSP!X;&O;QO(a$!AMZe{1P|k@;F~ z86Mq3I);6Z^gPv%i-KJrr?t=N3CDoV~yLBZBypMk8Q$=^`BmViz zZOiz)^0Jx`-MF<-81Z^H<8#>GHq%RyTAQ4iH_}!guslUTxcoA6xmX=BNwtOv-T77D z*>7J@?;C%;80WHY84z0d`cKy(k0`kAqm-ry>1b_-FBSzwA??4@NJX#v1`0$)-AYMr z(fxbdckkAPCtA~ty;h$J-v$&w7y6PYO?YGZ|HyteEw8!}paibc3JuJxLV=2I%ocMP zX9oYd?M3m+zc{YvhQL}2MeZn@%rxjJ^uz-L)z6#oU{5H)Me3Rqk!_w`X zHjjj6WG1m9^@3xHSm`uIt$VwWKQAtmH+J*~4lBF&)vtVCk-vXdY_Q>O4`B{N@J&;2 zL@fFI`Q6KCXK9x8V)I4<&09^M-rUQERL;vuzGt7?W4m@6c{%4*)!|Yd_h9tB@QbBw zA)_DbN;a^9+jVX!mb*>b+{dq;zZ!mZdv^7&Eh#Veyy9CJ1379Irqr340|9{SF-=-N8cB}ymIyI z;yLZW3)0zLufDXLtSk}vruPFthMCK`?~xd=r=*JG#3wjy;jO@eOyNZ!j&6-<@EfIB z_L?{3;+MLQs5znOOdL=~3&aHxD9j6*ME^7xBhjns%9j9{C>zRFe72 zx4(P&59(RfPy4>hoc-DLO!Ju+=2&S{nnyYw^qkQNfnI$5z(-=+)*GtYh`imu?e47ZG!BxF64K(Hy>`y(yL2H z-&8t$BN^$D#aUl~^e`LWytWWyzPR;Tv2Xa z%do9H-wmY%>%6%sU<0Y*TK}?3Qv=dDsHE3zkc(rbv7X)mC{3~|^0=z$jM40@m(9wQ zhhJ&~wZUHs0y21Ygs1Kw#Z@BqXtpG~_xj=DR~YT6z9{R@6p z{Ncvum$#Ie3%OF-pvLm*gf#Ilj>QkK?`=XR?oDMQrER18t4&gkx_>!qn}!LI?0piW z)I2-y0yO=mf&UCgtm*Ba>rw4mWLFP}6|`;ox6C=5n^WJiMm}XPC@;DhvkP(#j8HhO z5veJ{Uj0fCaPoJt=lTdgP7(ph=iD@ijWN}|I7v!X|8jbyfBH7yHDqp9vlOvwmqx}n zcNVk^X(*8R^&G@~3r!SlKCMPVZ zlwSRGT2n*{S#w&@HbJ*SS0`aDDCSz-2GSl$l3LPxwc&J%4JqeBX%<-noWuGhj=yi$ z>wmOBfBo0ZH4A!ekF9^@UtdZi7jADU+p|fZ%xh7Jf|jXBV}fg$xX+ldD3uTMA`=&# zYv%17PEpGO6V7HALZf@T}eS!6ZddnWr@^aNUSzpec66i|F~p+`o*u$ut)xviBia> zHI?R!1agCedaW@(d^D5dwOix%m}wGi_X%>w8|>Dk#{-o0Omcu5Z)2? z1txlvjBa^RG)8(9!1K|lixKxqwnL@Eyi8kxn)>JpD4L#SSUv%PIX1;)RSz7_eDNys zMJ)|gy5-WIcyoGBvTsbyWmRtHCCQ;w#bGz}JHu*jAU!8hXnuXpmt-Ad(NlpX`I`X|Jd204H2v z2U>rMT>9sCI>{CCHbhMjB^|>Gfe^})-^QF2neqljzbJ%RrwGUp{(`{^)OpE&zaM8& zFoX1jDV&Pa3(@DPE3BM^7t4_^W=ql z`kibi&mm4PR^RkVo9{QJ*$HPeZUrux<|blX%S`1Vqdr_;=KEVS##N5}-!lT1Tr$xK z>kgNEQX)#u!pNeKT45|VE2`d5kSMmVx5iWf)e31dLb$X@&VVnYSlqImH|-b3ZBq=} zw?oT82;;WSAg5Wh-2Q{duwA>Csq=jG6b;RJjDTVGakngTY5z%b>A~Rhv={( zXaknRwH3gXnJ%+wK=V50Mk4}!Q568e+XCe#h1e<#HLc38tG^m3OK{Lo(t5o(3C6zN zwf>b6yUg$FZ)oSFDH=6FsBXB&?Y1p)J=Jhs)52vGe#3gG&AWWDB$YDhq^U!g^d|V; zWqpkPW3DH!j4MKtDgA$c`DMac&Nv=lwvjy$#*b7u)k)O0{7!60*{uDzKRE$dL$27> z5v?k1KsX!Gq3~Tuo&ICO24WGfWpHp#$Fy(ie!BmOHqJ~;KgDX_1StDMR^vr)S^TuB zD!{b!FxPi?t#I1{Mi?x)g1#eI?St;bZ8Or|F*=J9Fk!!GNB0EX*rmjKn~#a#vQu2? zTTKl>)GWoYp^M{ll06`aHNTJMa{!swk(zsLv2q3@My0Hp0_EnCs#?X%V#G{oy-#Gi z_ubq}pVImjGWL`2C`Lb9jmQd?X=pLVUC7P}nvHqL;3s{Hu~pO(F$BR?62otNC>y1( z$!pN@Lf<={*-{@K7}PnD-V~9GeyCgt3aKvxb z#C{=wjA}HDf8*GHg0vX0j6ao?)fPJgKI!lU9Z6Yx1N`3d{%2_1J3fk^wJdFJOhO#d9m6;bwts!_6A;P>9#hz4Lg#rnfJMAfLWyD6ktI z%UOJB*eGmyV5l+x<-^XYu6RGys7pUFXx7U!k0sE{GRx(q+ZBEZkEd5-{mx`2Ol>*U z=W#HK4hiAfq?;?ubQsyNVaf^)R!D*=^Owcu!iQT}AA)Uqndkk5GS?Mp#`*L)0eDt!gz88kQa z582N=x|d8I{wR~2yK}Aw>V9F7LqHfQN+!?bw~&46k&msVX&x%^dSE+kzLf^#ux3RJ z3-(LNqDufF-5%e770VzG`37Rl8jgs^`7+WNp=~FKdi6a#C=TRDz=+zF%?8ahy~&wW z$f_O&<<}4Wxf0eL;_o!qy7p@z2@eHyP~Butp)I^N_f9UurRhQGOa zU*v?+RVq5mL=m?b4k=vA7zqc__eInugB_=>z}+@JstPVDj&=l7Ep3jYHs#)sZcfLeTZLhS<`;ek~&@L$5`k-#9vCM1n=O5=%&fY zw~lCjV0zXHn-}@69ja?Spp=@j4yXqwO+}gbLgwm6Iy358uVVG8KNf=E~qqVzk&S zI;C5%$C(bJ?_%vrroxY1y+D3^z@e!_l;p4$Z;#U{O$ML>*6WM1YTuRr_a^a7Q%FxM zXfX^dpXfkeYB42wZ5m?cU`*Fjs{W^4?Wvi-zkE){2xt5huqQ)YpTu%^V2lho^jwB< zEPx-v>~(B9$?a9xef?$N>0#wV+0)(K?GvfgGOI)bvW7#GlHMfa`fLQc3sBVcZ^m1_ zq{o*fE_Q2@Z>bfxNcYcM+H^-mpj?ZlT+5DB-+|DjHJ3|yFbaSzq^>P}UX(0Mn^i_Ctb`HBR)B;`f)!g{?<@PmpY*y) zlHI#SpJCs=WE&wQD8ON~2n333OPIguqe+S7Jf7>yA!@i53 zU#^-dD5xIrGJjybto4bDTxnl!%oCi#FZ9)Cs!@aHx|Ns@2OK^4f(rZqU};#CRL!~0 z4pt1iXpP^z_HYPT9<*=57dzujIsBGVN?tINo=ZA`)B@~|0DM+h z$?xN&>H(n3%gAX?6Pvc=G(7Msr+g$L*cYWm@y3y4-t>7FlPB9JS$LyCCA-*$L(}f7bJs@VF5+U<#j4L`{#psEoOUG?Q@2W~J&jiRi zh)--xOh3+ne6{FgrH$#f?h=mM#p(AdisSt*p`uxL3CT=!_ruc%XCz5c!-j%yUR&<} z^G}zlyG>o30L@3zXIKI@VkyP&D%EAxCjr8J^w$l#?7)-gU)a4TQ9S+#*Zkq2GST!K z(#te6&3=!UZco}B?3(4cIoJ;r3g;BGx1*o?c}K0DX#d)ANsgrT%esobd7%6xG>m(x zn2b@WT$~Ezs=qYpX7uYTj*E{GUzD(hS z4r%k-UpWNtQaJSnniJK83Bipiz0f0PR~RR&dWpb0NAN{U*8(UMCl}|1=obAeOBrNq zB_5NCk|=rAa=%Jd4nr2E5U)r=nDj=7UL}L*VAZ|z%3VW7RUJjN7T4UALTFkF&GV>H zpHCuddP{!0m$X$fHV|f_9el#&GF{6u3lkR8>?$ElozBX_;3c_B&RIp8oLIFClB})u zO;er6vA5QXY?x&g3Q8H(b?F+*P7l$zHkzG7!gk?Z8u1BO{QkTF5 z>{PtHCes8nn#E9N>b$pzGvHWO5S=e-Iqy{;6hLesU4q21??Dw-hC7F*}4PBd15|^y`4k0EMlvm;( zgNEdU;{fVeLGx7Ff2uJA8(ksJ3)Lxqy;*lxkjK5IV`6C_32gIa7c-)MqyqL53(f zp_Yr(*r6x8L^~KSf=JPHcCRmkLI~p|FKXm~Gb!9#j>FwWiF9LVcfyFw7W<<#d+_Go z4;Ffc_9kRcB64M*^a{F+B)7N@cLJ%n94kS)oVr(Jn zp+5f$0Ne;aB)R$KCnb&R^U6Ol!0@6nLKN~erI|k53soyOZmU%{T1sm&z#3bMupxZj z3mFh&>%xx$wO6{6%H2ui0iiI;jqVUBpI&{JMZ50Xelj8PpBe1lGhd_IgIpe`Y?a)g z-ifJM@(GX+?{)Ne{rudv08fsWf&<7 zx-jq@JV%JtCQlaa@mJ?e>UHK@f;L-$VJOTKe(MAIw81|;;7xTebB*jiiM5GV#7WlJ zvjzz~OyZh=KtlZF{`nm8JsPBazP1-1Eb7NJk>?}eqi;pHfV@8xCb!$jiBSjXVEK{Y z&{5S4vZ1oHNykjQ|A3vB6!mrGJpwFFqi~*G&6!6h^?U5^U<0D-3Bm^*8HMN{xzU_x z^J(lK5Cm^NdyJoy6Qr}0ha~ek{s~qJ2K^ZZT@r`O>EBCkaXqVliz~O>#1BZCkP?PE zQ!}QOyO>lFzJXa;DVMb$nd(ZD)Vp52Ury)R@6%dPYFW*+wkMgV)-mZ>0jq9bLJ6-U z&ucAb@Nv|HB}TkN0zbSl8OO=R+ITCH6(NihN5;>YRx~|DvBxm3T)g=qS25ke^O_6R zD9MFrupp^s;P;HhKzU>7gF8Pd2diE~LLy8Uips@8Sil#T!bOo(x}!rJ`-Y+3rS1nT ze!66*sh1iDiZPT4m`%R97ewOHv{$zJIL>C@lb1ZTv$;sD)>)3)kuWLRChHF~{VdQN zX5Ucm&vI!hZCr0wwOIpsMI@8>R+a`$__JVcFr8+@y=Hx08LSXnOYtPthP#Db{hVUM z?SGZiLWdT1D~w63tzlE?b?a}^9gH5h(5GoI$Tpdgo;jbQM8@BVE}&T^w={+a7bUhh z7uyeePxL)w`vf&=ndGvXQyJx-mNK4blXLn{VtJb1)$H)YR1imv_e*wi51Cy!AQ?A? zp6NSM$&%-**)=;DTQg6;7(4v8J7>SF)G{d$-RLzWSbDBB6OG3RHMi?k0$p0y89|CG ze1=OT_jjKu1#$HIN^ZlAf2)N zRyvQ>DUfZFXZSm+a35}Z_N0EB@S&iMNssL2b_t)M87)qcTopRSk@pq0#LidvSOMaY3g60AH!ci`h#+p~m2Xst$2D$73GX4Rd>yH#EPY^u zz*4%#>&0{5e*wQC=t$mxk~m~zSLqE6bAi!N@{{E?_I2Iss*C3}bDeqO#&rt*5opzJ zL*qK#9W-nOk@P$1le=rrD}T+kUlA8&6<9<3`c7m_^PU24{K!V(XDzCUXustS`ZdeP zw{9W9^w^*|F1gDpFBWqW3ek5J{2dBfoMUk5Z>>r49dvPko@;u5WeZF{*SesP(f$(P zF=1AiDi9y3G-Oh&yhHic=A!uOC12=k=Jl4J06{XV$NV;7ciB#56&k@d%ip#`{T<~cWGeT2)f|H%a7_)+x_#AX-c zZ95nwL30V!q)-eD#~0nMQ$|DB*;sM-F$E!lVQWPk1YGXgTGMIjWz%}CLSLN=gti5P zz~uJZ0vs<%Cxp*Ii(}08Mhw_uT#l0mj}F6MDjLBm|C25=^NBwB1$1&xG*?P5SPq$P zt7>r^xj`%p<&9rO?$~k;h_^g|40c_j&<8b_42k>}s<}&^SrF`LTlbn__p{u-Av}Gm zElf^BGxDlaoU=4qM`M+Yn>eU(yDn`-E`>5_k=jo6i^*;I&FR?NG3C*VSbvZ%H$9RI z<}EFN7tMxyYbq)KQTHdRoP^oh29>+?INOIww=pY_WOv~_b}}^^8YDUaS%@+2)n2W) zv^sA4h%<$4Daa`IlRM=;#%2VBL-OJNWshxihFr%a-*FVw1E0EqKLU*z*38R(5D}cb zArKuR%yo0gz3VvX*dI5rgUx-iWPcY;zG8TW?<$>J`ep6ItpvNgYI_iUxEmU>`AP!x z{9uGrePHd_a%4<8tp32->ceCj+&d}GYxFc^FJJ@!gV5xRQ7tw zQqwbC%-t5Z&yRp;<~V zCO=NUjW;HWTC7!9jbL@5wbog3$Y?{A&Ebln>DRK>6AWK$yC~_N{capFJr2x~4MSWx zi!aG=2$;x<9#+nt3z@K6o5GEh2EiR!BQz(w5X*>$QK>Zvl&+kQ*S>Le0c#MW5W5v& zRT9g=qRq&4*Q7-$Nt|n{XrjY)i7hs%A(HcQh%K($2%;_YJLr@~UP>$!5WG*=S*xU* zF`6Ar%6G>p#5=gL*m9T7f@jYP$cVTjN}XU+F@UO&J0Mj_44_q6HtVHr;{2 z;trStVYkAiNQ$Xwv+fQ!I7U~Gd&{Ts#rXLeNyBw5Y+UTI>JTQv&uGh2L^iYb4fv~fE&RsS!y3x z7#<5>_u*=A-QuJi8rBFOFp^Xg!gSp2b;fFu8{lil^z7=%2k<;w?#C|A73Nj+zZzIp z*+ZA_yaDU7=?2!-!^vhl4Y!AJoB*YTUhTWN$wMjpC6Xuz3nlScmjg~e?xC9L@gbZT0=Gg;WE-MKf}0XbYrfMgEUJ*E}YRyx6y z(NqG~4JfTj5{cYsC$L1YX~Ul2mEw#GfO|v3dOT$GGgY89tirhN*0_}Rfj=WR5kk|- zw;XUFpM(Ta8ikzAu>YcA@jR9>JKV;D?t6B?s-NxsMF#o9MozkM5qnp-nO2O$nL0H2 z?I+PL4QM1#oJ$z-R$UONxTGlk}hvh6{%c`cKdC;yR6W6xhgnA4?~ zgI?XQCx}`~9pQ!Xk9vcO;`Mh$Emv0$5qU6Ay}gb!lJas8$)yav@}6Knx{RcqsJZ>G zA8u)`Xuj*7$Y1CWg7z^9<&wy`iHpcbCRMn1jFBp*of37`p5P=0AkNO-$d!)P{YRT` zx?S(&IE$ZygMh_Rc|@}x=We) z13HkGy$1jTAhMi^*2>3~!<2bwM)R1y#?HopiJMjsV#Q`|KM2=24%5MEznkp~`wNrl)51R1M5l$%{i*h^>73!!zB2-=dZ;?g#79}EEqb_BWhYEOsm&6aln zlJ_v7fAU2a0f_+TxL{onC;P*Twddd^dphOfU}>1iMLtd4clDz4z6{Nko9W#rW32d@ znim}UswZ4DoIpW)6|Eo+jHHZ`)Q12%FFm z{mwPapXFJ+!xYMci`~8puM( z(6(1O?l@4F*6dA7y&xlk5DnqJ2IOwTU1!#YCCVM79I&uy1uXMPE0qO_p=T5NRh0E@ z9%8k~I11FWKIlX{2~C2nvJ#>2Ud|5jfcQ{o3RV>)Gb>9pnKuBlSo_?mNtu%q6vkoJn9gvr9*u$ZE5iX9XMy{J3;b}! zilD~OU-DoDoQu9#TbK!|{tACd0{43y>6!Ry_dGf+jJYWH*6i(em$Iin9Ex*alHQy{eG9}gC|u6ez12)kVBSc z0pdL|MyPy;-*g!oTLwF^X1c0G%cf;Tp{Dy+z#s{>ZE<5NUm~zH!~jYTh+#m`Kb6V9 zfsH71b_I-BM&fM!lwQ-MNp_d0gUlah>l$2|*SQKs)n zmY6;>AcbIwGLAYc{9uF3C%Mt43ZU@iwFJ?M-7iU;8(&`SmP-V1$}__bCNbgwk~U!( z>HyspV3w?ruDKwl*_u%nvVy;F>fTJ*Q06h0CUT_J83TEiKw&*o8u~L5?~@~iYPYi# zy#-}gFZm34*LuN=@B&?mWLN-a_u#ijMGr1t-sW59pZ;QHZ0KL>Gkrm%&8v2`B2LKO zgssSPXY(LPg%CppP~2fwShqG>vzF`a)~dd=CgCYJ!x@sJnZng>_{B79(v>HHsw)c@ zor~a2OT9B3c58OF`ctu7$hWzEFSy%4Rykear?}A(24WpZ8uZ6;HDd(X4iHe#N#r>U zCptG-$F;eW(C6mi6Q<%djp0c5 znf#m{o(Y)2i`1s8W;qD28%Zv4AnBwVZ)hw|pr(as4r5l;={nlq)_VH4I!hV41WP>7 z5e8-U){N#j2xhbuZwP{Ybl?_5hb7m4SI~hlE*Wg=2AmnpB70MS)`1xTMqP0Xnam&T zdaG`4bP3S(n>sQm!IE>U+8|V`)q&84V!nKzaLRNrPk}C3+_H2 zLtjX-z7H0j{Mx-&UQPUsUBF+3+jVuwIawokmNXwFMf*;8&3(3eqFsFaFOI$Z#QF%K zE}F3r&!YJx8bxg$`tV)cN$UFaw8z3uY&4v4)ctBnw3$t)6-UTwB}SJ!ft&OsL%`=U@myc0YK~7!s(+ME{Jxz^08c3$Y81Xw+0hP_3}DAwsAKN?g$Q zb6pBv_N)FYf9u1DAjyp%&;T?l>j-7uq1WFL+YMGc`Kp~iX9vPD{e&G5{f>8>x5cbf z`4&=&6Zx?8fEtt1&g7o)i zGNY5oO>J|dB{?;Tu0A|5Wp(_BIbO@?lt&(@g?h_^I=A!yhGUd`Ba58TcT8G z=BQ;P;~#NmQA4T9`)MXB3ayoNPDRvBxxqV?cng!F@1Xa7QOkx8aW*k1{oONCWakD6 z98-)mj{-p|PD_}z4c*%jewSKS5cM692Dzri%~-fgpc=@aT(IiyAx!2YagrQH8dexu zdx#^0(bQMaL99O2p|c#8EmUgUCesH3HtD}3pJG?f3!h`}t1GAI#7Dl}k|b8JZzW7$ z0h>;c$Yl_r6Cc5xfP(!9{)$+I_>_bTy>z1lgj-n60f%*Vq4*T= z{g9y8f?!Sx#pa8mBf)eVj?dcme@$)rJ<0S=_rk>7{LBKYn6p>vQ}8HD%Pik2U6OJ= z65$4Kr`xPubI9DsItv_v=|qKw`lo<|)bxGe)Gn7BY)tJ#qY2d^XC@RYJ12Z}%5qK) zC<~KL7a+(%oFO~FImYCg`M#uR8T?QoHeD>uDa01RtC>UrM1^25eM%5L1kN{2zJP(z zdaVq=I@S5;;^2r^1_iPBVkb--=xdlG{?oNQBc}AK&2N^4aX#D5yFzM?ZHd#D;TpZ| zOro1eCw_AR<<2^;2NAo6zDM0BHGdB2O4HX^c7>Ugs$fp)g6ObGYAX2bHMsw+5v}sQ%a{(36$J*p-d=g zoKW5OlBAjo2v}*039V20EFDB1G4upGj21{{k@OwjLdw83Nz8#Qj5Oy33b?ZBMG&xRP$6 zHTsNiC6db)1n2;@pW{z*KMMEnHZ-R~cIpjl4FfQ?f1Z4byPhZ~w2M0NxdFO$*0_^; z>$Wtu?VcMcu;yuY`UNc6dRBzGM^I{&QQVpcpg;M;Ok*vN*B&f9AaGW}rQ086C>u&Y z&`RDGl*A=86Gb7d&|H88{l75s$fuxFUS&C*!bX(?$@CRXg_(2=UwQRu!bLcQzt$90 zn=XOzRlx9@G8Dj|7R1mC7*+dB@5=T0<>Z&?H`*Vu3PCKVchr}ZS9}3xF3|zH$os3i zLgqdzrOPB9&I1x~G!t{``=0SkpGVY{Kn85me+)%yo9H>}4PLZ3*T>>G>oF;P!@9&L z>%95ud)Dy3@B9V(20CEKE~u^x3QDZu{2F^#pN~prhSnNG083)tNab%#vGRN&b@%e# z=LDqZj7Zlst;W>h)=P%g1nLeM~XyABf$#3Ney=g@3Eu7 zkZtVn3hNGfzmT1Cc}f}}%r0D%7S*pC$I=J?pmhxJt-SikS{c?~0+;Ja@O1q=LfF0h z$HM~(JClv+M5yjPts9K8t)C9*-rQpgXx->*E(OTmCWwSf{s2xo0zUS+?Q`5$Orn$r zk-iidG!>j#*uxZ}L!EF*BlLA_TFsYcCk-vTa0-%I2#V>F(aSTEaj?EyuQvA|2GA5A zSw~~xX>g>*CUovfIPjnqF$fDb3Na_Xk`P8BPeMIjv)zw@It7EX>(<`LXgwBE9RfcN z22Jiq>@f0UC84z!ihQqxQ}hN|jnUS9he}_!Lsv${L2G9eV|TDoC>D?4%x!$)v z&` z(J*6fSINOooGl(0G%U!LPj>$h<5E_mUL_RiYa)hpoAqDCM0t%S)HF^{WuD+%N}qh7 zBy*C*>lNl*Kn{Jxs$z}{F|)FCP+y~xQzxgj%!PE7B^14^kc{c=u;gP{BnJe2GIgIP z;5CUoBH+0d#|2EZr#Bup?F|e9F}f2y5Z%Y|NOY$aQ^dcsTxX7goxZfXl5VU#nBDtbkVIu{|pfRSRchfqK=;;POp*=zm+-N4v@|WsaVs%jK zVQ~6-ner5NlDmY~!uBxnLxedp5?*8`wRF`cf|1O0%zB0+*=h3R;sZF+4eDwc#xWg7 z2Q_!ninFbOV_w!tUqxUmLZ8d+sh8y2CKuSYx&ID7Uw_2J0qm z*-rIHOUH>o?Iu#5lksIig`4inb^S^sa%84ZYU#eO9#q3 zYlXqsC>iX|1;tvyCjmG+bGxR;gVI!z(b=BhQ2#cOqL~zr-&@0*rA&dgXZM+FYbYI; zZY|KI=Pe);84qhqKIHapx{C7$Hbw{UbX}KD8Lkiu9eVjmE%9p*WBe)}xI$ZN`z9?N zRH@s8hTY5fZ3&O~^L{Ma6o86n*oO3!hciOqJvcqM0ySO*Vg|6G7gX!{v3T;S7-7j- zl>CThOaexDja97p_CvY&?p4#%Dg*LN@8;TbMr=T?X*w}Dsy=!ZL<2cX`j$9Jv>|Qj zfU%Li_3G+-q-F*d0Dd4UcL%&g35Pb;mSc-cnRikDA;mOfF%)s-wr$czrk9ypW+Yn_ zjc`7Q+Zo1{FvNGU1Ajr^H%jv>uDTiL5$m;W6&Nv*DtHw3@nP|?7V?Te+C2Zxa!v5j{G9evBH9Y^ysWe1-~!xBYHa9j~!H@A-~;b({JtwiGS zlP3$SLp&UDVBy3YEBpn{LK9OD_yMl9z9e-moGJSV4#?q+)xhU@YfHVhp?M?KfSNQU zoHPr)x?_%38o-ehkOlPwH~{qo3aJnRWo2OZ&{G>yRDYP2()O~7L6Mgu(!**(KOC0n z_{M9_+r*K|kx-z(W+Qd?=-7q|OPq3sR zb63MtAM>|m%qA=z*1~y`?}amozSx2C{hZvFh1|#NVv{x@A)PAA`}w64U7nNs^_N8q z>FuBBKab=Ep1tbKa8PXz_yME`LqWyW@QeCr#t3gpx-+XRv6^#oni)$5@~VXM2WiLP zzog+OMfJl;{W_?UPMbGaD_u8maVQxk4>&0ZMdl4v2GG1#Q?9IcPu(q}FbFKqeW`uxDGFF5DVwnyy7%(Cr zvl$2wG)RSj(6mM=;{gOA5m02X$UKIG06_vVG8`pAE2lUl0YrupYLOsdlzIH^VDJ6T zbAQkC{qdzKR!YLo-fOS*u6Ip!-fBQ;49JjJGown`H5zV4xg<71LE22{7bw&co$bn9 zJ7ldBFr(zgB@lhINt+t0hC0LkdDOTI*_uR9J4R!lsO!n{8sph3PMQM5TW)vZmPbw~ z@MlxkyvObduwnPO*l6VSlm+QWJ^Exq1UANXa9{!v|NG_K!c0fC5wiGJ01 zpzB>^PxaXLy$ZQo*;H}Wsio=KGQ5?Ac+ezoh4pEycoo;tWbRLjcXpW$i3*W05deNp z6b=2Oeb9isN(t$9W7tuXy}M3H$VyNu6gcMq3EPS%=+wz`Z-`*97wn;pM=^CWMu(OW z<7%sd1ILNM5<~b5cTd+CsdB2oXDVQ8rNwl3H+ao#$VV?YBy7q9n!Vf`wmMU|6IiiZ z@p1#T{_^vT2PD|L~dA;^QG$hP)DeKG5eE*1+m z>Lqg+uuv>JbF7bI*cMs~1<)|3DsEHQqp|4aJA?YD7<>c(v4aPQHO8PUWC8F@mT=!2 zY5K`@;GZMH5*>(tiQTmR0YVtC`VZod0((7k}@?1)9ev0{!PZKJ!$3zb$4O4D*M;EPaJ2x-A+=%K# zx4Z~lo3psNfvd7HA{g9k&N`KofV*uwKdKIV0T7kd@qeHT=%cY0%c}4(fVJcD*-&7p zs;#hR9ld5jUiQam_Sz?n1VT;!FV+(P(VT)Q^&*uXXh=z}$leO4aSu0x$M06J-~y%z zRp+!#kp50)TROwLVdBkQ!uv1Q6)ll#i5V9gy~fx*e{Pf{3V99iUE!B2!PCx?KW;*^ zP8r4AG+OZowOgxyf|b4Jl(Dsz9mF=ADz=5Z02Ha(nNY;#D)eq>3=xHd{$V2NV^t1} zop(U&X-7kOrp@Egpn*X(hT5&Pcx^(Bxm!pV_eXkHMhq7fPjl**nDuHX2X7#e)r-zXWx6w5$jJWbl8)U6w4-T%P14m4`` zDl$F--4)>}qAogmXQQi)t&~7CSP`C<%K_SSmh^Hzs&I08BNSDXV*XhHNKQE23)ezB z#k3jfPlFl;@16==Ukqn>t}SZsPG0#jqwr?Yh4F|Sv4;PZ*Kr*{--{pOZiiZ!yD>(C zkAPq!Q2OfWfVlt$AEtB*n3piXAeY!*c(AbylxGot&qW67ng%Ihhp$Q6R7`YMdIvZ| zY(Wafqd!G?@Es+msly>?S4S^bM$oxW+3yt$H=e1cm~9N__G6R$(lXVjLmu1otE*9~ zY(PzFSitnY#^PaC3v-ywgrZ`I^l^5W-hiqeb69-_^3}v$#RH<$Eb8NdMj2lab*9$= zf`r|yQZWGVxFE+rn44PJ9~TTN5kk`VUotdeG2;}F>~Bxaa;vl1^Hab64kt;O+06whcBW$txbatAnAt!ztn`v({;M^#6GA?L_Vf|2W8T z;PJoh&tR|IANgvQK;S{r&f|9Rg$HbqOq$mW=ri0pevmyR%VRqH=;WL5K^a zdV^x&hC?9!xhL7BpdAs|_hPlMF~CNkui{JL?vI`l|LA<)@Vw!JDoDloSwz;g8UADS zgGREe_)!xmy0F+2DS(t&fc*#UFBTqk*ab=`n_~mYGm6iwiS9-Ac};_tm@GrjGC;Qq za^iy>-I6S_V!4uA3NLdVr#?GCI6uuAqL(f5ZE-C+kUZK^v=#zbHI#_O-z>0KT%|A5 zH_k?D+!EdIx5Zi5EN7V}FoF7UA9-E(k;VQ7_L12{@2=}9G{O|WaP@t_ z?DEw2NNl5iZY<`z=L=>zS8ENEu<(rRjtDmko3keb|KUNoM<1*qlk@HJ z?8qBKA|$j2;oP_afJ(E<<04hKYwM_|TBqo&LtvN%(ML3F%4igPFYX?~YEiw$0-Hb1 zV<5IpJb|D$^zp{g-9HqDQZl00uM`Q)GXv~V{`Xf7+X^ksqMlptq;C=4i$q5^uF!W^ zuk0j*tL;4X4}PSo5H)u?NhyJu-2$Y}Ydq^AI!Q?(P)N80+)7)GYa8XA#3d)%MQz7Pxi`bk#GkJ8j!^i6wqVgmWahl zg!}da4=@~Lr^V?$xLi$SU~ z3uu3CoTt!x8|~0+oHpV)FR15|RF}mn;?|9yVPo#UdLWbYw!U~IH}p=CGTBO3Ui;cM zqn%zKsAyrC?{0qg*uPd9wv8SGsTcr35r}NNJbQCv;d?=Nb|)x_dkKgx^=VhC*GF!B zxvt6+QU=5*hI0cKaMZi3-bUQR|JEF|Ko9V8ZA&1RaUj(RGzTEm*4t6+fmT?`*pU z_Tj~MBBb~Tjh2EPXn5}2@?IhMq0Cc_1XE02RHEu?2F~nIvuJ4f=#=f}b=&0L&+E>p zipRM3UvgiWXJz$r>wDBDJwaMqtwae!IC%nfA2s0c``Uu;S+MQX(fHe*uQwR#)9Y#W zeq-6)ssO+;L1@PpkSZXJu`GU5LRrQ6c;EtjiZ-aAdg>Mn)D!ccT}W7lgIcE=WvfB` zm_7K?!F9)5^!TxHa0ab=)N0VgW_dv{>2$A*wk!5o?=)RkTTdrmx&fc271@Wp=3@H< zs>8#V)lkjr_sml^fXZZkbmF}Np(yDhU+2awOY=9(JQE38_|oVF%6r1Pnt>N$Lc-Cz zA+RpWC})-we`I-%Uk~hd?kIm2*o}MusnXQ1_};*EsSzmsby;8bXzdvR0qy|WVI=_; z)30W*lAn|R`Q6jlwKK^zGIH>_OYl-aZYmW;C9JzacRO0cwr_)mC=pkyK^@w+3&0!W zK34aJCNZCz^TzI0|2jAm z4WK>05ncwFWqKc6O6!|I?jiOxG`CUU6LtG=VaG}lOLe-NBB;t*8)C1;3HA9R0I6?_ zO`8T=EV1Xb)NY8Lr9nZ7&PU&m`gI=jb;-st{8K8b&a~vFkXa88=bzv^!;4$*^moZy zgYn#%ktmQ~tR*dk4h@mCmAAetDtyn2-4VA;HtjMuT6WY@GIp`<*H9j9cYq^H0}WOf zAhg#X;#^eYBlGFv08t9FFX zy71rJsgj^3jSc!7Ayuq<)NbJq=NX3tK5xkIfu`I^c@;I}I~g%A$m6c>zeEgsV!f{Y zUX+(HiR;AOV)AneGeJG2Bw}Gc!L%$l9W;={n~RNXh+`u12DL|8k5DNFjUhoh0t1p5 zK8;kgMP84JT<`L4Um%37D(v>a8|F&Uh^d5*SD%Jk_eTL%7A7tml@a#8 zh`EL99Ocl#@-W)p2yeBGCVsyTt!NJ3-aNMMwzc9Mww}J*-8AHzVoL8`Pz*K7`iY_( zj1bQZPQ><_H3RSRs`%FAvc=9%+n&3@Z|M|)D(Uyp2O#>{|Lli(OHg0@HP;nbS{*eI z%mNvLqac?FR4q|}uzy9GU{#9c!UCZR&FHze1y`mf;dTM2BCw8gSmH*Fu&FtKbJ7j#`4?s z#aKWT286YirO$-5BV;!LwmaA_&t1{Y-;HE5QOa?rtI5z~)oyT()Rx%ay3K`0mOcBF z2x}76+R+)Lba|;^!2vxvJx{IZCXI>%%ao3Za-e6){cv~Cy2@-&4+M&zayBotdp z20!w+&9vsWJ;lc+>lDb-p6B{d`AdVfgVlkht{7h5=v01t{V_`Q!eMd+!Yw2%*M6j6 zlx$c|)2<)(6{4rnh@|5XXL1SFM9hkNAe^}uM;!`x?{ZwOFOUXZQqX|yY5A6b2`*yM zax>yi``TxY69p4742%{ZHg6PDD-UYCLh|u**88*5{b*=2qxaKK1%>a2SsTMYa4R(J zKU`?i8(L;c%WzT6K)sIRNjTWrP|WWz=0l;Vh8L zh4v7s<#~|J(3rmAqO$K$n5RdwoJ?}I?C9s2)4m!7)ktEmJ|#%Jq5^Y-PBhq8tW9;) z&nhVi+c~hg2VC&`O=&^mq>Sp<)rJIL8s`eJ7GEOy5Qr^TJVI)`5LX%T+y#*C-{3cH zmDC>tVgAUH`lIxnD&ifEWc6M=qsa4<0e<$r_8+-dxM})G>!jnks!S5%;Bgch_a!QN zN5iSVLKAx1H$hugLwL4U9@Ks|2|eM6R~fQJUVj)I-TArCB6xT8hwi|Usg#{|47wVE zQT7z}x1u^l_t>huC4*=$URWA{%g7{K0!m4RK?Q3#MnNQ|RH;kj1&aJWu;$gK@|GB` zrcx-myV`jC(#4Bwml-C@?v1nOym-@Tag37sNVY6oggh@gFr-V*gHhuLiYDe%sbZoUPQP`QPB0)X(ZicV7`V zTX}nycEnLP&IW2-j%%|wD>uj1*LNCnKjD~aGuC4*6do?#^`zFUP#1n&bWb^-^;%bc zG`>RACR=P&e+zihk7O+##!aThozHw}f8s;T3EzSd8X`>9N3d2)S#99IHzpj+CVf!{ zh&{h{P=Bzde)h*RplE2S0DZoN9@E~JbJ?={?~SK4La9^eGhNQ`kRq;CHm77!L6 zK*E^CSmkom4!#(v8Yu)yTo<`q+24(~z&3M?4hhd`H>Ma5HXn-_CaF*_{RgbBJKXFM8{G<4DD)x1TpXi=0 z66Ts1%A`I{1BIHfv{xrT9?)cme~Dr>iwS*2JJ@EaFul4<1XCm-nP_V6s>D0+&Yp}G zlobniM}HqZ)m zA-6A+2T^d>j`UMWDJm+$RX%qS23ZfbNDJSKe#R&SB|g4XGFVMcmz`n6W%D;L@JzF~ zOGAR3>#V!bdQT;M3+J)&OO)h8amimOvwpCqOihLzMaKK6$n2*osHlH2uyOh*gzB1UDMBcpY_;w#u!dG1>xA7t6B$(XtjHO%QtvR!%X`! zq1GEjj^2T|&PHwr)}%*KfqIJz+wS{R$#ExOgg7AZ&$ykYh-bjQjvUU3Hm>t+im**tPfIJ5^ztQhqi&x%U`_dKv2 z+w?)GmxEA~daTUWgkFQS>Jsj-?s9Sp(DQsozWp0+B*DKsfFLhEx$N!;EA>y0zX2hW z6)T_BPnH&NqZ+?t zb#r0;LeBx06W2dpH@;3mG?6NExePFE0i9%|-*X`}GE)0jmpd?^Wy{_db60>Mxkm3C zFUs2*y3|>72pDWge>1WQsV%Q8MQq}m2p@2-WCvBr5o%9KWg`sqjAYD)pBK$fekxX9 zzqtDD_uiKEmPy8?Xr=3#X<*-5RKyt|tIg0UTS_qP5{6K~lqzO+$Nhpi5YlyK4yt_R z?i5tC-XT26-43((c?bM4`S~yr^T)e4h zUATqcC>L$Zh>%H-tHFVOJVElMf&1s&SW@3vSMQ1PK>_qrY|x|l5;6l&bJl=AP@58( z`bW#{Xpq`v?oFP}=R_{Ebddx@J*VR&oGvA3`3tqd6wgGPN!x@6IPpJQe)fc-F88s% zmxX2p5mAmIr6{@xOP9*I)4Kgn?c_kk=9YE3`c|N*nGN`!FMp2kx7Upnrb1xnfhCXH@Dr{Jk$ZMM%A*YBHR&h$?-`X&(K^0GK5eb` z+6B)W>PYxUZVums@1u`gzLuR{i9E9Zt+Tc+YWoC( zI*V??mz10K_-pVU3BDWvt+3}a^wp&yQjN3SKp%Jiok6_;Og@uzv!F6uR`%lyW0$ZJ zb005fkFN9Jl|V572A%gnS)$t>sfte$n>g6n+#>mQWK~u=T5!!@sO$7r37USOH~Np* zp!L(v7yIPRyt2ZWBsadv0=Vr6rc;z+GvevWFgiJ#z_fOXSzb(^-0^-YEf-=;8p<(@ z;oDLo;~Df>us!&VNIv8Kpl*y{?hvr}Ayo7McoW{bRadeO9|v=a6xZaOWz#`YDm(Q2 zBo%A^m+m@BFSpp!Vb6e)0rM+B;+`LW>CT1?EYV*Ib;-3E_cmY7#gBgsM#m%gbRg1P zTGX7bJn2$w-;Z#qZQ>=hFx!ZcLVXa4s-G2H?RF#jmkz}h3!Clp>>)RD?(5vMizq{Z z%3`#;_N;KmT1!UgHhWU*h?seI1H-v?L|IA|kEoUI!=kfJw8A4OKKQ~*K&2+&wXzd# zPxa%JYHP2#Ns;_Wsj0d>C&z#VTnvaTgZZh|WIc@7lM|~X6nq*gd?$EW1B|FuNc9GE zVK^@B4f{0|WADK*g}+8~i_dnY07$47N(*C9TlRap|5{PIHPDg>nCom>sJhH>)ri1^ zKtqz#r|v1{d7LvY+3*+SWDO4uwHiD>>q>97Nn9&jfJ}=}+YghE?$U<^lds_HOMzqR zE4Y^2S_(qznx)rFo3$6AS90<_#g$pN1mNJ``ST^M{wZG##b00JK{nb_NMV5&`Z**h z`h!b4i{@<#1~?$bUcb6X&R5V|^5NqFx~`vf8)5Hfyg0G_H=|s^QlF7LzNJ1geiI{= zolZ(WST}OXtrPu09)^ZUodQzUV!9$idd{6~^X0>C+}1v5cCa!18_)BT&DyzESvMMy z;`y%@Yqmitp>72yS!Z&V9dgn<+fcSY2K0;{eP>6RJxdqWZoD|i=?$K zC6Z|(fu-zd!1C|g2lta)p0Cd!Mcz`PrI&>y0MLm?Ji~8%Z)Ajij#yLdKugjqF^*or z%@{7V-O37l7ybO!3u|rktCJ#dBj}Y`2)YD#+rG2c11+0t`y;b|IwwQ`!|G3!?~4^cL=oH&eAxFi2$xIN2H&kOVPhlopE$C3SP|@{2K6I;!A1etfdg;J2W{ zKdg=zElw)1Lnesd`isu>3(ryFFKmw~hmszT+BXb^9D*O@8mGTjZaWkxO%`M!{GQ?B zJ?(+XdP&tbckd1WxYQQk0?p1c%#S!yBYXX^UQHX>=FK_RY;KN{)ck2j^Q?5vPfYF! zM?-yc_auJ{<;4KE?o)LlC?Bq8c$FfH>tGIV)q&AF{)E+^JO4D)>G`v@ zwU)bbDdv3@b)HtaayN{0n2M`Wc!cO?gs9e1%dngdEelYPE#ivhrYMCd|R7@?{D8E0Gc%mm7=j+~~n{x{NFB z7rR@w(mJeUX>1y0Se56BkB|B)+r^|WlmS1E6|hdAUiZ8OaNb%m0EnsXgOlw*FN>yR zo#jN>$HE2lrzw&GBT-kTMm997xDk}q*_#cv5Ne$?kp|Ka@-DmXa2BUt=4%TdRw4nZ zN0t66KP3whd(P3E%n`kIBP4y{qnwKk!2onLLRx$AmVT5I9@USjRcgQX3V9je4$(5gzk{l`dVc+`40 zV>^mPnzR3)Eae%Ihqt^J{CxU5jzhLrdQEyFpOrMZw z?c~|5O$9*Hc2b#HX5Ry`j9e=m;%73Rf~19tD*8L$+zXCol!ImGzyV zP|+f$uo}rE`QYMb@FhJD<9r(tWIs$Mg8rADy4uLYl`N1JP51WeGndXr`G!&uul*A& z9YNpG#xPImX8oi3sN1?o1{L85vL5FPIf0V1LPx3E0x#+*8l8M-_;%=1`Qh|39~ULw zwd+A5zwFL>%WYjE#>+W4Gu?cF8Ybqw_@Q=1IPwEDYf*m%^e^xX$uxk6#T$4O>Zj|k zxOjT14;w+>Wt=G@`3NuGpLk$LxAuBDyf%ufsx{VbUy6^A+6PY>8p@#tk;AIQz;6}@ z(nY!iKn#7=U16g3`}Mc@tA4y<$wy7Yph=Ir?M@2C4?WNkA? zj6QpAeLfo0{b#3KcmMA8vBz&R7?%!>w^ll3lK~7mUwn10n+!6^Br2nRIDn=PtP@p2 zq%77@5E6>}|L9qX3|J8X@N#Xv=m~+2Tx5KcR$2d(w1*lSg#E{F${jqb&7reGm3T{+ zgBC*^L%n#LeD0DQ8!doGDDo06Y}`tZR_siB)kf2t*S-7@efC;*zX|xgDetp9#EP!8R4 zz=i?y&o$9O?zcYhB+abjvTOQ%@5Z2IC{wLXPo`t)o1kcqxm3-w>$}?jutXA~SFTYt&7c2CKwycF+S?%4ucvByyu2iLGNUS*sAA22Bs$y|Z z!e-TBp*Z`FuCcz@So92pCRG#kyiL=p+o5`J zicA16D1a9xoNo*QMb)MUuOqpq0lh24N$?_g?i1G9o0)r-x_M0og%q(u$G^d`_rsKU zo_zY+&p^VQYgmW|;H4W9UsbD95c3&!X26vKg^~@%X)IGpcUyti+qOhQ&HkboMbS|a zI`Lk7u!C2U|Ei35Kfx^tWKMIaeEKW9=c;dCnWx3Hu9w}M!(`Y&X!;Yk?DHzKW@Wxw zk8W+a3#A)*)=C!o!DSjW_V(gk`{fPmHUA6e?j^+SlfEjCeK~5vWMKEcE<8w$w-i7{ zI5fp@t+rJ}hj0ifvxC}#qBkI8Cq9kuY*=-TpA#)SE9VhV^a2sR%YKgd!}W3>I#UU6 zQMC+)uQO4TGG2coi_VkNHmlu@pB-L->ActI1K$B;5c5Z(vWJ5MJ80m2=KR3Q~gLvE#Joc zwaox8(*X!hKFb71I~T0DR2XO<5jkKC_XFkyu5Gwe^_b0wp6*w#3qJxaq_H;MA)BAN zK|f;puuc9V)8)&cg*E|`1hEL9#r3cY(cI2##JGB9`kAMHniR=3<7TC{@6Amn&#*tf zIPK}$_zYwzBk91@bx3qDpn{pyhR89Xd+ER{w(?pv#UoVAmfioG9c~14lBJh(g&l;q zv?GWF*d26!95=zm=dz<#!H74l<7 z>y~o&_gmk$+=k6_ufViTaV5Ec#|CG0?MRwAXa}Ly9zjI;lgw}Kf8yfeDZm5g>0L1c zUC3ulo#loQT3s2mbl`SP-2)`zUHjg+6p@gB3bA+C-M*^UUaO5QoErhWrT;qO9Vzr& z&fuiuRbz)vY~L2P$EVpL`%eSc%d&~B2$(RKB5epZf520EeQxM;@pGwu3-nr;t?@er z&373gQMLzRE)G7ft`1Ngzh^+532(mYhdD+BmRiXIPiH76EB2w?habY$o<41BUC(+V z_;cUzmbf?BHd!-R;b7bEq-xElps8dSV!x%=e{60eLYo#Q0cEY#z{dS0qhBR;X&!XY zh~X~L(=MjpF#`@Rq*K@osu{9pGe`%kg3^NT&PDXegOfq5k|XT_pAJrJ_9__+8#Gfy^SmXUjD8qE5J;lIIoBimxTh@-a{nbQyhTI&b%?xcvl7&}`Ff9t0H@iI znu;sH6;yu^KGaXg9FWVNP1bHV`U9_LmD2WUswL0k@skCfna_MLpQq90T{F5RjGP%DT@ie!tQL3XoKY?GYHAkb&LyuZ)gz0{w4 z&%P9%7N^Qk%cFLeU@7&(uS#@Y$6o*l>M_h^TGxnZ013q>+RmQ{Y3|77F11q0Cq-wK z8EOeKFs;is-@wSJb0<$6gu6I4uZS!e#c_=rF5O^ACq5o9_CR*akRZ(~K2|^b#xZQO zyauoCT$fw+y%IaJpOmKq#hZ*e3`j<%nned++aOoqenj2ajN~U}ATMgRL-LYvh578) z;jO=;K$zvlkKBQ(Yp+QkFJ5?rwk*^bV8rC>@be&~ zL3u1hOWa@ZfS0)8%ztSpKZPmC=yadfF%7Y-ZO2@X=iuk_xo<2 ztr!Ylz9i5RZp8XrSt~u{eE@y*^gmVKq{>~v)yAHd_PuO;;^OIV!ecWaUQ}A77$DE`&tlR8b(0K-kC-hh|--x6wr$!yAtR9ErejF5m4N9kuh z0FBs19#XK^XL?DoJJT{rzbU*M-q7ex_$}&`=5M-Hde?CqPX(bN=#Aq1-O;^!Q<2A+ zNGqt@ua{{GF4T-}c4rzWKz(Bd0r9f#{=%#WqWTgYS~-)AtU#9e&_PgDqW&e%!J1|e ziaNLachM-0c@f4yTZ7A{M^fJZ;L~rJa%w5JqT}iy7yQ7w#Ym-7%UbPOWf-m*(M+eF z=qaopZQPf=?`pScc9;;eO+gYW>YJ@rOf>qlVt4LI*4-Pl_V!gB@syEQZ%UES^!@F-ZB-wx_T2>+xU1U#ZG9_88N%T2W3g>+>Et z>q$OgBb@`N%QmI743NL#TQn@g^@l)>T{KbnV-ekmSiTn{K&oV_{viD!Wme`e=V$0( zEeNQ20A6c0+Mgc?nCQ1czmuhKuh2HAPF-JWHPcpDhd&?MX4kwT%n7eT`$8{)Vu~_< zKK9nEbRA%g6b){VRHNOSy8=_OwQH7lYgYe?k?0pw|a{i+dYY^ zC5y?GeQ#Pqjx0NHs!GcHZ(!FSPF1|`6apmxj%7(KV8+`ssZkO^s%-{3nqS36g0L+J zE=um6k`U%i%{GgGk6Rb^jHBF74JSJKRt^sGR23)p{K z#PKwYk$0qaR#~NbAHJ&DXoA@u^G&|pt4l3?g%J21j9lmb#;c)^KEHearm!U?`BDIO zd+8}{_fz3c>&VU~%BrJf{$_Z(U3*+;%?c^r%^`RU$$Mnf+xFAci@MPDC$XQt+rtiJ zp>z>On~Kmz9j$Lxm9YU%p_YmapmsL}Oz?plRbbt{dv_$V#K{e&bW}pHm!I`}8PFt5 z2Bm^QinrU2Yet`-Ai4~&nQX{QAJ9QPns1_+7JSpwD*6R(qiy?OZ`)z#jhdY={N3O8 zfxvm0m9P;=n+5-{Mo%!gApq0?2Z;`wh+bm;Cv5btT^ym6 z!Nx6+^Fj}j{VO{fv@h_oIHFGY5Y(GA}SRz=HW*lQPeeJQIGu=OQeTWq+@v{4Og9l8}u^(!r^6rd5~Y zV5P1?v5Qw8#OHgyl&MB6-yMvx)-TVqlMGRUyE#7M6yCIJuPr}w&eb8iKk%|0nO|cS z)99A<1^n|4lJH<;&P5H{Zd}BjIH_ffLvYraxh84$>2{6YQSfoTYy$He+?7k4`<@Jk z|FHhha~+R1uTgv58m&b_jG4xq8#l@hDAK)78U^ifIPQ88O)ifA`jk6Lj%suR!{IrH z2rY~ePf$*Mgy@mkZPgqMUFnbdOnR@{vb+71Ho7yvI8ro^Qn$gWljhs(UQM~>2>P*j z3*x}ZF296q(?jAPJQIJBn77Qbc-F>Z@vc$I<(a2>*v&A_U6qvKO;WLuB+PH+=mw^} zL*Y%LLmUuQP8*#|(^aRq!pG>%0&36s<)06cSV&$#7D9<{GC?XEiK0W;7oXr7_?mrG zKCdxy!$F0JUA_dEq!~~{T9QlS33E1<(&E}BC8G9u_v@d5N}!-p2+$DGVmt9?iQ*u3 zvLF>_zl!38`J6VrP`T;3s`PMB)k^+iEc}ApPwcJCQb5t{^jC1PnrYGMmu@CHs)s|N zMs;vb0tN8r9T@JC9w6QYn`_IT15!TbOu6+wzd;X;^9Nd~0eB~Vyd@`p@W9zi=120Z z#*MNR4(})QW@VLySCPXT!-F7D3SwM&Kfx^P@c~P(#Rg;2Mw?vUi3n(T;D_t4!(W?) zw3@wZD=>mqRlxvacl7lHkGbHqwG)!}14_|U`YUK%YA5CAzsWE+HoF=K5+dsr)Hq&s zLC|3N9u1pG>}X;_qZ&iD$QMEM1UhrvUj?ptm2yL(Js*Sh4Fe5{kUTn7;54ck5d(fE zU3UTxW-TSPR(l(ZyyfKNa!y%;0nw627Eq~1%-W8|`HPP(eldH{d$`zn_r?2{y+ti* z{ZXFScPq@Rp)_iIQvsh@gbadv`7|d_sjUxcs>N(9YUPrR?wh-Bay ziox>cBZ&#W9vC>_89{NQMiD&cia4ogCK6asjZTgkGvJgFXkurtLc?&U1tv_=DUjkv zpb&HyP^+}=4L?;cmFYBcETi>EsJLW)F`4#`9%I{qx6n+;$*bm@SUTSQ6x+Ew*n7S2 z2cGj_hj??1xd(8ZV&&vKzzGn8{CG3XNFX2qhlCw$I{HP2iX1o$>Q@|8uV%V8e;bV8 z{@>5?vORnD)vA%IB|ksA{Xe!49O%oSaij{oTNZ#3@ROhlU-Axs835wZb}6`@bz2tn z)dIz}z$X6nI({E`*-=T6gCs7OS3}wRzob!9(m}O9(!{^rsfb=PiH7vMDCVhgmK?U? zH(xAnPCg{Mj=c|Ea`xG(SnJ<+E$*N87x<|Rv7yUHjvRdaLf^e3|3^dD`blYsv`F#o z{l^&rM=!D(&6aan^j!SBKnYARZ6B;AT*wZf(%phw9Lt8>m*b3b0!Ho0@<&}ozL6f? z)?*!3-T-GscCPr_7^Tam4Je*f6y>n$LdGO>kwHU_%!ki~uRSt0WCcKWleENLhEAlB zK;ynj=z!3J^Sm-Hr)_&m3UW$we-(%p)`Lh90C$dIFr^!0pUQeQL-pmik%|>%cjCHy zc{SVt<#rAsTMf)xxmP_{C0~8M3va*}%^4YPL{l$8$(=X;0(b$LE?Z&TuA5&$5Gri8adsW=x99=`L%iLi7P~rS-O7_ZvNjBy|1vxi1C2?6t*R8Fe-gfv5g*i!Vy z?oJU0i;Lw4RgvOp9Nh)qq63%gR8A2Bf^6Ygpu@=Y>G}3%LqY>G{RF3wTU9hPp}wHP z!3Q=8edkqM=pD??_5KMici6^x+oN|fetCDRXn5+sBnTx_9a%V zrO)^N+hRP-?oWj;14D~b!+TdZ{yqSvbkRB}UVj2&3$w?;Ff_1tXy5;}jX$lg{YWex#N#iaVweBEp?%o$7CFeFv$?b8g-B>&)NW0W-;zOmf4)-CzX+DZyy zw{4$*U8$YaQ~&?#7bpvW$6o;H>-F;hC`m*aX;e5d#xII@8$-JNCsL|gj)2dBiSOj0 zKz<}W;LTJ)$6$3IAl1Prnkd%QNWe)qUx(NV_HmhaQlE^-9(*eFeJ1pc(E2d+GstAK z%Y!9lii+&%^{Xe8JGq51e(Vr*>%~Ch4uVmpDPl&EAkRDu94Z4MBxm-gd-t6TK#{f^ zJ|5HSoYrQ=je(?iualx14m-Fyk zshfi-L1*AoQ>`%sLo*YN3PD={kB|IqmmmNvU9?dRW?USi!0S-)r2HeT_#@k+6F)K( z@rY9lk1PY1k8*_K>PAy{Eil;$IgJrfbO|jZ$MF_~21UIXPd{3IT$W)>cDE5ZK;L_m z4;Qn$83ZF@Ck%9w9|1jP zUwW2uDf^}-V?x)HQu2GRKmDY*>yR?O`)}vy?ZaCVCwXaBFw=k5EJcM#$CjfHNWR}Bj1+kLsTh%iWglt%sB}xTQJs}K>*Chsu&v8|M&>Wj=lm3qJl-aA z{6!kx<=4Z)}&)*EM#%Wha0%hR8K8m%s%#==(UT6 z@U_O3yLNeTNZc`}5#^U2kOFgKQXSv>qhMPU=vj7wc;T+^GeKm?hoK2$P4naxRn5=V z2L~wO5ARTw`I<0k$t%-F69Z+rC z$N!?7C)VD%u=P#vXXp2^iT{*2D(W4W{C%<@Wjb&3@Z_e2I264FQjtIXv?Uw*%N~R} zLWv?&=9*&8fS~+OR6!aJ#;7buIsz&UT(@F6a@h{Vo33>NjUE7!6}#@|W=F=C-d_ly zRrfd$!4#0^-$p+_*oU3Ytc;-{96Xd>dX_;H0u&C1mf{$Pm1S*0@4hlBGJ|xP11;#b vye~Pu*Du9r$A9|~YUke-e{|~1?n=FVF#hQumjq3J0}pq&_nBswi)sHKPe&=h literal 0 HcmV?d00001 diff --git a/web/src/assets/images/order/biz.png b/web/src/assets/images/order/biz.png new file mode 100644 index 0000000000000000000000000000000000000000..bacdb54efc8948e369a20a1f0be0f1cbff6240eb GIT binary patch literal 3756 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 WmLQTPF&%UO0000 + + 对号备份 + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/commerce.png b/web/src/assets/images/order/commerce.png new file mode 100644 index 0000000000000000000000000000000000000000..14748ecbefdd07ef8c43f5287b48aeebfb5a3551 GIT binary patch literal 2082 zcmZ9Mdpy(MAIB$rML+#iU!nRHN<@V)_HAnJ%(hf=*<1@Lm!*9}E!PMQTYOO>U$>e| zzKUEYVbfQxxnFfLgU~G%|k{9wTurP1~Adm25ae<9@a6_(S_*hozy)F zJ$l^S;Dm*tk(H5&wK3Sn#MBmSY6pfmnEv8mb`lPOIzr76&{IhB)2P#yPFA+g)^-489bBF}iCoV=Y~1JItqp59nrKiozCUjqUo1A}e_g+v8oqe8-B zLc?OOU5^XH#p7-y;KBhCZ$u`A-%P$0l^PvKijF76-pPnd$V^PmzMJwe>E6S%`@g4W z6cRHENts2Y%;Jo!(#-7AtOrlCbIWobl|RUv+CCB+K!q!T3u6D1LbWarMr>R)7;wE+Wzi!$6yF#Vo}OEoVXZJ( zLMD54mLr2L)H-Hl zYyvigK+Uae?NCnV+|eGF{6nzU!onjWZ{CiMjlYwScrP_8JHO!fLULL8i`x1YDy{QP zZ{Nu1*!aXp#`Fwxj6YSU-^A~9(lp=$3H zJTRuJ^O_CE$#w8Wx|?ZPef+Ge8+8qEx281M585w|#np}LA>-H1lR3~#SFxag> z`PrN2kC#UsG|<@*Rlyy|<{K#AF?wm`9>M6;a8uAo^TbDWJU`SPmbym2fdEx<@#)#=W&4hskm)VG=QWMsdg*V6 zp%?{qDyvdwL6kJT9N}WUW4Wq9(jhSOGuJ-;>RDAq;vJ#SBZ3GEhuclQ;`liGLuH$d3L8eYb7wkWOyUEFog1Vtndi2_1FH%tx zYgC>Pp>aH1o}m9%ivCtY!BR?rJYo45)XVXeNZM}~F>=@I%z1U9NGVpNOBCtGij;{W z<=6)G+>d)bK>{@5qKbALg-EO>5aW}v<#H{h#{28?(KQ6`$Kj#z$u+}wj=Li0b-yet zK*SWwDCBNLZ|M<;P&X~-YhLi#&|)jDUL}mia9OFw9Uygj&vywZET%{RT~WrwQPpxW zm-(i%-7=65XVRlX2Rukphh9~*Tp=FmolrtArR>Wa5KhYOj463b&na1ZDeI}(I(c+Z z7?YsOo+0P->ksDDon6bScr1Vp4kjvR&NK6A5 zTgISXv-I6poSAB7t6d+KYFRD|lXKcq&gpqId_aNoFLZ$hf5t=#ezJ{V=ra4yT@_20 zQ!m_Cr^CV)VM2AaLXN#5|Ia5MeB0_Yf&RhQVkePDThrOLsI`;myrs|r%20m?(Ta3uw$Z5e*g)=e+I|bRlfivn$NJz7f?X~08p-ZMy4;uLP^uUo0uhhGr4MK~v g;vtysul~`}8y+#sYVF|Nz;_CAut8Z@S^C8P8|kc;u>b%7 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/order/corporate.svg b/web/src/assets/images/order/corporate.svg new file mode 100644 index 00000000..07b92a45 --- /dev/null +++ b/web/src/assets/images/order/corporate.svg @@ -0,0 +1,15 @@ + + + 企业_画板 39@2x + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/order.svg b/web/src/assets/images/order/order.svg new file mode 100644 index 00000000..5ddb6680 --- /dev/null +++ b/web/src/assets/images/order/order.svg @@ -0,0 +1,16 @@ + + + 订单 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/order_hover.svg b/web/src/assets/images/order/order_hover.svg new file mode 100644 index 00000000..7e9c7b46 --- /dev/null +++ b/web/src/assets/images/order/order_hover.svg @@ -0,0 +1,16 @@ + + + 订单 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/order/personal.png b/web/src/assets/images/order/personal.png new file mode 100644 index 0000000000000000000000000000000000000000..1e64efd61cc5c43be6d201bd25da5beef3eb8ff7 GIT binary patch literal 2007 zcmZwHc{p3?9tUuxt+8ZU)HbxyOfhT-9+c*Tuv#)NQHa7Ng9l zt#(CQR4hsCL`lRNMJx$IL^VP7jkaWty6yAa=eh6mIp_S&`~AJ|`Qx1Dq`5lVf#koF zmy(hK*+Z?}fNSjD@r?{{{;sTv~pkKU?!x!%nY;ky79R6qf`|!58z^eU}|M@{*df33ud?4Dl zw*;8^@7k{g(EO$TKk1j~YtMf1w6H0ss5!S7fXoAwAoEI5`6a0QQglHXy0D_9sG_C# zd24YcpsfT@)m~cNURK>v{-X2w%dX0r?#kMpsyYDX#p~V|^}R3adtU(%y>(6f2ow&1 z8fZY_n_32&S_hHs!|09?bmvG*=SXYUXj}JKdk>)mn{MJj_rU8k(9FRiRE(>AE@n5%U5J342L!Fj*V zeZS75Z}1qKd-wR3iLgL!)Y@{iE)U*W&S#NN9f|L{># za!PteZeB@QdBv-m+GbR1Hx@U5A0tf9%#r68DJ!(qH3o~v7mCE&A3lEC+0DAr9V{hv zu*cro@@5c)S+wn&VX2L`v1WaQCckn$Wp^z5BVu*4N*{(DI31`Ik>iyaVciaim@>#I zNEjwmE|LRF7as(yT^jG-c(-H4G~sXZDIQF7{^GOosC5DOi9o2J2m%Q<>KdYZGc%!-Z%C07CsGsXiN&65*idTPDvY8{Ca9P~0!*Fhqw7LgV%u$Me--mQ7;b_Aqh~@q zA<{bVLiLiEg^LHV9q?o1H;zYj91n*OMd?th@+up_WVx`oOEVF9uleOAcB;myWZ39;u$&>^~gIpxp@$#dr?&`ptfT+rYMMO>U%D{6$HJY)lrkGfAV-i z6(n=YO4}~(@%KI&&Z$;HrN_#5*9#Hb&A5p6XC3mVupvR+?b*5Bp8W5wIeE>LJoP6` zZl>cU4H?8Raw?&WW|Cr8xR=qh7V&bC%(sb$&-5Ba`E&e@t<9Iz^Qq=DCd2SXh zTOOZ)ipH3QXKR(he~;XpMFipS>ZfiQE%(gGf2ahwI@1XfSJ4 z4IB}xuDbcF9_7X|r}Prm&?vj$hZVK_rnHeZTsR5KZo}2MClUSYOu#FZ4QlwvfBHFqk;898w7@Q}9?XngJvSSSOW^2+eTqJ4;gn#Uf1Hu2 zUwl}3$u0HBa7vVFe5`#u$WB#%L0Z|uqbE3ga4hgt@VNS?a%+-A8@d3^L4x7@z^7SGE=3-J*u~j#O1@R%-*a8IB;$LV;Vl7KsK<6dHO0> z78QHsrkl(2juO)_1G8XwD7yFz{L-x2j@T(jtL5ySxx1<6BNi%>7l(}d^R_a)h-bqz zXB$&OXnE@(Mg7|}jgycSjgw(C4fi;^YqGA8e}|0rD8l3!J{OZAOd9w|^%L>Sj9V#h zu(f?Z{Br98R1L>|^884)pDki_3ZXrut){pvr*Qbk$A{pTe=6p>=P46ZvT|f96kuHn z_hc#xChCIGb#^i-@k#V+7|W{_zS@zcl~>j-%Nniy>rSJViM!Q~)_HemY(jb`XZP4i z>VqyHztTFUJl{IhqgT<3HQITl~^&nabZ<7|z%cIVMwVIQ(U literal 0 HcmV?d00001 diff --git a/web/src/assets/images/order/team.png b/web/src/assets/images/order/team.png new file mode 100644 index 0000000000000000000000000000000000000000..2a059d733b0b1c6bde4a7907378f5f8047bb2173 GIT binary patch literal 2033 zcmZ9Mc|6qlAIE3QwT{-3yReuG19yEG`0*39GB{VIDp#z}g}(7_hVi z%geAb53GgFd}VPH7ULgQnVZd}1z2Ig3KLjNSYCu>#wIL8wxvY+-z>|>>K2>gf7#sX zn`_JXPam-$e6QJ>_-#7UM_kBOnQfsg=?5`mZm#M@AR8%QZY zx&saA(0mtK?m=5FwC6#4K6I7BV}vpwBUC_lCG=E7?*n-95T4=T83Fo;&{q!wBp7Uj zp(Yq=h8Jxx+ySGVFh&MSH&A+D{0U4vhsi#e?1!lVm>z_gVVE6*ISR~;!y78lCxJc% zZ(qT?8JM4e1sW{Q!QvZWAkcyF7MKX{UGPMb$;aE=Q7E=P zLp>eKE7Q!Jw-!5ovv?tWeSAr=08d46Yz0N%bFZ@w8{59~o^frC zy6o&|NWJuWhrgd|TI=|zSi!-DamE{`th}l9REO*%8_AfXe7s!T+@h4HR=0j6FphKqR2OJfhtaxY2zE)~31p=M%3 z_z^d`<`WSlTRFNkA*YbUj8@G`P!*(dU&-OKzSU%{Rw`E8Fle`*JgIF*9dNSB!VmP> z)YerWLRI$!*9Co{9pcA^@!Bj~i>6plAFXFr$T^z|R1n9Cyp)~UIWBj{3Fo)Ax!`v? z2e+(q>~S=dV{3jv!u>9QyE03-nHyPl`0+XPQI4~2iGJQ4YlQB_Pnz#ZHt}VTh#7(` zA5YZdyf~L6{@y?Ar98Q`(>0!mV)@Z-HS>xDFA{^Bu9zZl&~evm1Mw;}lXG@V*wpzY zVd;puM!(HAb6OzjhnnKxn!3<~`2vqJtk5}3T0h!TKP#)zlhYSp(x-uS75C7yDRZK! zobDDYA*-j{lJF&~W>@IBr=HKXtO_EH{2EtlYv$2eaqCaceZ{9YhK8V0TFAOKAwfz} z*7k70SVMTZtb8dvSPsi~H^XS{6kfib7}^j|9F(cZMTedX*d0D<@5IVH1w)^cKMMPH zDt%TyQC8HXZ`JB>UBuPO4yPnmb>nIWUV{gF2fe@jseHS_{;*E@Fopd!gq1+0bF`mQ zWVL9rD3h85E!r*=Yqun8H;N@8$&x@}jSsh|H*wJF0~0TX@Xm$iK0h$P{m_fS=Mwh$JK}Z7t_wN=isimH@`7@R?bMO6^v)5x?9|y@U&8$wtYuS@@5lwK$oRIj z1t)baw0yXfT(5+Kf@|-oH6i&(@?F)20qwE@gakZKRDwaA0XWBx-(uRX#Gm-_V)5je<()Nu|CZ;DoJqs|;yYM@??1L^Vx@}o&>H_zkukAR=FZLJ59`RWYmUA~c zByd_y^K+uY%iVO+N3>`%!q}e+KcW*p3KcdU)$dR*6Zch=G3n4q#wvDwVVgKMCFHPr zqvuDppDf}{Qa=Qx<>N65!P$DD#Iwl(>#}r1%jDsnjF?`prH7>17|FL(8OX=^4rg*0 z+43s8ZCs|jBF?x{1qy-^vgt~**(4vYY4bMR>u9P*&t5TXqM78ZX#F*=m>q@D{zLad z=anV?IM%|cOYIF;PWP`n;qpLHbkBLAKGA9!9fA+mTjNGb;!r?-mcPBj5`Mq0Xq-W8qUkis0;xtWOO8MpUiukE1 zQ;bDROTH%UmP5Cmpjrfm6Vq3;$7>GtPx;5V6G;2`gY}zMPpzf4qFwRtl@y}T-iE*A z`1HI$;_0hs7aB>{wPZBVKv`U6x-scIH{Da|)7_2j8XoV5WVLILA@?ZCP#>dLbJFqV E-!b2}kpKVy literal 0 HcmV?d00001 diff --git a/web/src/components/SiderMenu/index.tsx b/web/src/components/SiderMenu/index.tsx index 91d3d0f1..a39a0b4e 100644 --- a/web/src/components/SiderMenu/index.tsx +++ b/web/src/components/SiderMenu/index.tsx @@ -38,6 +38,8 @@ import toolIcon from '@/assets/images/menu/tool.png'; import toolActiveIcon from '@/assets/images/menu/tool_active.png'; import apiKeyIcon from '@/assets/images/menu/apiKey.png'; import apiKeyActiveIcon from '@/assets/images/menu/apiKey_active.png'; +import pricingIcon from '@/assets/images/menu/pricing.svg' +import pricingActiveIcon from '@/assets/images/menu/pricing_active.svg' // 图标路径映射表 const iconPathMap: Record = { @@ -65,6 +67,8 @@ const iconPathMap: Record = { 'toolActive': toolActiveIcon, 'apiKey': apiKeyIcon, 'apiKeyActive': apiKeyActiveIcon, + 'pricing': pricingIcon, + 'pricingActive': pricingActiveIcon }; const { Sider } = Layout; diff --git a/web/src/components/Table/index.tsx b/web/src/components/Table/index.tsx index 6524d1a8..62c68dc3 100644 --- a/web/src/components/Table/index.tsx +++ b/web/src/components/Table/index.tsx @@ -19,6 +19,7 @@ interface TableComponentProps extends Omit { isScroll?: boolean; scrollX?: number | string | true; // 支持自定义横向滚动宽度 scrollY?: number | string; // 支持自定义纵向滚动高度 + currentPageKey?: string; } export interface TableRef { loadData: () => void; @@ -48,6 +49,7 @@ const TableComponent = forwardRef(({ isScroll = false, scrollX, scrollY, + currentPageKey = 'page', ...props }, ref) => { const { t } = useTranslation(); @@ -86,7 +88,7 @@ const TableComponent = forwardRef(({ ...currentPagination, ...pageData, }) - params = {...params, ...pageData} + params = { ...params, ...pageData, [currentPageKey]: pageData.page} } setLoading(true) // 构建查询参数并调用API @@ -95,7 +97,7 @@ const TableComponent = forwardRef(({ // 支持两种响应格式:直接返回 total 或在 page 对象中返回 const totalCount = res.page?.total ?? res.total ?? 0; setTotal(totalCount) - setData(Array.isArray(res.items) ? res.items : Array.isArray(res.hosts) ? res.hosts : res || []) + setData(Array.isArray(res.items) ? res.items : Array.isArray(res.hosts) ? res.hosts : Array.isArray(res.list) ? res.list : res || []) setLoading(false) }) .catch(err => { diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index 37d14c53..d16c9e67 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -38,6 +38,9 @@ export const en = { emotionEngine: 'Emotion Engine', statementDetail: 'Emotion Memory', selfReflectionEngine: 'Self Reflection Engine', + pricing: 'Pricing Management', + orderPayment: 'Order Payment', + orderHistory: 'Order History', }, dashboard: { totalMemoryCapacity: 'Total Memory Capacity', @@ -1704,6 +1707,123 @@ Memory Bear: After the rebellion, regional warlordism intensified for several re privacy_types: 'Privacy Types', summary: 'Audit Summary', } - } + }, + pricing: { + title: 'Flexible Pricing for Teams of All Sizes', + desc: 'Transparent pricing that helps you easily find a plan that fits your budget.', + solution: 'Product Positioning', + targetAudience: 'Target Audience', + orderPayment: 'Order Payment', + creationTime: 'Creation Time', + orderPaymentDesc: 'Please confirm the order information and complete the payment.', + orderInformation: 'Order Information', + paymentMethod: 'Payment Method', + paymentVoucher: 'Payment Voucher', + corporateTransfer: 'Corporate transfer', + corporateTransferDesc: 'Pay via corporate bank transfer.', + payeeInformation: 'Payee Account Information', + receivingEntity: 'Receiving Entity', + bankName: 'Bank Name', + bankAccountNumber: 'Bank Account Number', + pay_txn_id: 'Payment Transaction ID', + pay_txn_idPlaceholder: 'Please enter the bank transfer transaction ID.', + pay_txn_idDesc: 'Please fill in the serial number on the bank transfer voucher for verification of payment', + payer: 'Payer(Company/Individual)', + payerPlaceholder: 'Please enter the bank transfer transaction ID.', + redirectCountdown: 'seconds until redirecting to Memory Bear...', + confirmRedirect: 'Payment voucher submitted successfully!', + confirmRedirectContent: 'We will verify your payment information within 1-3 business days. Would you like to go to Memory Bear now to start your experience?', + stayCurrentPage: 'Stay on current page', + goBack: 'Go to backend', + transferDate: 'Transfer Date', + payerAccount: 'Payer Account', + remark: 'Remark', + remarkPlaceholder: 'Please provide any additional remarks here (optional).', + confirm: 'SUBMIT PAYMENT', + submitting: 'Submitting...', + payInfo: 'After submission, we will verify your payment information within 1–3 business days.', + paySuccess: 'Once verified, your subscription service will be automatically activated by the system.', + comboName: 'Combo Name', + spAndTa: 'Solution positioning and target audience', + versionInformation: 'Version information', + orderCycle: 'Order Cycle', + orderAmount: 'Order Amount', + personal: { + type: 'Personal', + label: 'Current Package', + typeDesc: 'For individuals', + solution: "A person's second brain, capable of storing up to 2000 memories.", + targetAudience: 'individual users, students, and first-time users', + priceDesc: '/Forever free', + supportServices: 'Community Forum + Email Support', + }, + team: { + type: 'Team', + label: 'Small Team', + typeDesc: 'Small Team Version', + solution: "Enable every team to build a shared second brain in seconds.", + targetAudience: 'Small teams, early-stage startups, and small projects.', + priceDesc: '/Month', + supportServices: 'Standard customer service support', + }, + biz: { + type: 'Biz+', + label: 'Most Popular', + typeDesc: 'Enterprise Growth Edition', + solution: "Scale your organization with a powerful, enterprise-ready second-brain system.", + targetAudience: 'Growing teams, startups, and SMBs requiring advanced memory capabilities.', + priceDesc: '/Month/workspace', + supportServices: 'Priority customer service support', + }, + commerce: { + type: 'Commerce', + label: 'Commercial OEM', + typeDesc: 'Commercial OEM version', + solution: "Seamlessly integrate advanced memory capabilities into your SaaS or enterprise product.", + targetAudience: 'Large enterprises, SaaS vendors, and system integrators requiring fully customizable and secure deployment.', + priceDesc: 'On-premises deployment', + supportServices: 'Standard customer service support', + flexibleDeployment: 'Supports localized deployment in data centers', + reliableGuarantee: '99.9% SLA guarantee' + }, + mostPopular: 'Most Popular', + startedBtn: 'GET STARTED', + choosePlanBtn: 'CHOOSE PLAN', + contactBtn: 'CONTACT US', + memoryCapacity: 'Memory capacity:', + entries: 'entries', + intelligentSearchFrequency: 'Intelligent search frequency:', + timesMonth: 'times/month', + supportServices: 'Support Services:', + flexibleDeployment: 'Flexible deployment:', + reliableGuarantee: 'Reliable guarantee:', + alertTitle: 'Intellectual Property Authorization Reminder', + alertContent: 'Please note: Using certain AI models (such as GPT-4, Claude, etc.) may involve third-party API call fees, which are not included in the Memory Bear platform subscription fee. You need to pay the relevant fees separately to the model provider. Memory Bear only charges platform management and service fees and does not bear the usage fees of third-party APIs.', + currentAccountType: 'Current Account Type', + validUntil: 'Valid Until', + orderHistory: 'Order History', + order_no: 'Order Number', + product_type: 'Package Name', + payable_amount: 'Order Amount', + status: 'Order Status', + pay_time: 'Payment Time', + viewDetail: 'View Details', + PENDING: 'Pending Review', + APPROVED: 'Approved', + REJECTED: 'Rejected', + allStatus: 'All Status', + allTime: 'All Time', + today: 'Today', + week: 'Last Week', + month: 'Last Month', + threeMonth: 'Last Three Months', + year: 'Last Year', + searchPlaceholder: 'Search order number', + allType: 'All Packages', + orderDetail: 'Order Details', + orderInfo: 'Order Information', + orderPayInfo: 'Payment Information', + create_time: 'Creation Time', + }, }, }; diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index e602fe0a..ef15d06b 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -38,6 +38,9 @@ export const zh = { emotionEngine: '情感引擎', statementDetail: '情绪记忆', selfReflectionEngine: '反思引擎', + pricing: '收费管理', + orderPayment: '订单支付', + orderHistory: '订单记录', }, knowledgeBase: { home: '首页', @@ -1792,6 +1795,123 @@ export const zh = { privacy_types: '隐私类型', summary: '审核摘要', } - } + }, + pricing: { + title: '灵活定价,满足各类团队需求', + desc: '透明的定价策略,助您轻松找到符合预算的方案', + solution: '方案定位', + targetAudience: '目标人群', + orderPayment: '订单支付', + orderPaymentDesc: '请确认订单信息并完成支付', + orderInformation: '订单信息', + paymentMethod: '支付方式', + paymentVoucher: '支付凭证', + corporateTransfer: '企业转账', + corporateTransferDesc: '通过企业对公账户转账支付', + receivingEntity: '收款单位', + bankName: '开户银行', + bankAccountNumber: '银行账号', + pay_txn_id: '支付流水号', + payer: '付款单位/个人', + transferDate: '转账日期', + payerAccount: '付款账号', + remark: '备注信息', + remarkPlaceholder: '如有其他说明,请在此填写(选填)', + confirm: '确认支付', + submitting: '提交中...', + payInfo: '提交后,我们将在1-3个工作日内核实您的付款信息', + paySuccess: '核实通过后,系统将自动开通您的套餐服务', + pay_txn_idPlaceholder: '请输入支付流水号', + pay_txn_idDesc: '请填写转账时的交易流水号,以便我们快速确认您的付款', + payerPlaceholder: '请输入付款单位或个人姓名', + redirectCountdown: '秒后跳转后台...', + confirmRedirect: '支付凭证已提交成功!', + confirmRedirectContent: '我们将在1-3个工作日内核实您的付款信息。是否立即跳转到记忆熊开始体验?', + stayCurrentPage: '留在当前页', + goBack: '跳转后台', + payeeInformation: '收款信息', + creationTime: '创建时间', + comboName: '套餐名称', + spAndTa: '方案定位与目标人群', + versionInformation: '版本信息', + orderCycle: '订购周期', + orderAmount: '订单金额', + personal: { + type: '个人版', + label: '当前安装包', + typeDesc: '个人玩家版本', + solution: '个人的第二大脑,最多可存储2000条记忆。', + targetAudience: '个人用户、学生及初次使用者', + priceDesc: '/永久免费', + supportServices: '社区论坛 + 邮件支持' + }, + team: { + type: '团队版', + label: '小型团队', + typeDesc: '小型团队版本', + solution: '让每一条业务记录瞬间成为团队的第二大脑。', + targetAudience: '初创团队、小微型企业、小型项目', + priceDesc: '/月', + supportServices: '标准客服支持' + }, + biz: { + type: '企业增长版', + label: '最受欢迎', + typeDesc: '企业增长版本', + solution: '让每一条业务记录瞬间成为团队的第二大脑。', + targetAudience: '初创团队、小微型企业、小型项目', + priceDesc: '/月/工作区', + supportServices: '优先客服支持' + }, + commerce: { + type: '商业OEM版', + label: '商业OEM', + typeDesc: '商业OEM版本', + solution: '将强大的记忆能力无缝嵌入您的SaaS产品中。', + targetAudience: '需要集成解决方案的大型企业、SaaS厂商及系统集成商。', + priceDesc: '本地化部署', + supportServices: '标准客服支持', + flexibleDeployment: '支持在数据中心进行本地化部署', + reliableGuarantee: '99.9% SLA保障' + }, + mostPopular: '最受欢迎', + startedBtn: '立即开始', + choosePlanBtn: '选择方案', + contactBtn: '联系我们', + memoryCapacity: '记忆容量:', + entries: '条', + intelligentSearchFrequency: '智能搜索次数:', + timesMonth: '次/月', + supportServices: '支持服务:', + flexibleDeployment: '灵活部署:', + reliableGuarantee: '可靠保障:', + alertTitle: '知识产权授权提醒', + alertContent: '请注意:使用某些AI模型(如GPT-4、Claude等)可能涉及第三方API调用费用,这些费用不包含在Memory Bear平台订阅费中。您需要单独向模型提供商支付相关费用。Memory Bear仅收取平台管理和服务费,不承担第三方API的使用费用。', + currentAccountType: '当前账户类型', + validUntil: '有效期至', + orderHistory: '订单记录', + order_no: '订单号', + product_type: '套餐名称', + payable_amount: '订单金额', + status: '订单状态', + pay_time: '支付时间', + viewDetail: '查看详情', + PENDING: '待审核', + APPROVED: '审核通过', + REJECTED: '审核不通过', + allStatus: '全部状态', + allTime: '全部时间', + today: '今天', + week: '最近一周', + month: '最近一月', + threeMonth: '最近三个月', + year: '最近一年', + searchPlaceholder: '搜索订单号', + allType: '全部套餐', + orderDetail: '订单详情', + orderInfo: '订单信息', + orderPayInfo: '支付信息', + create_time: '创建时间', + }, }, } \ No newline at end of file diff --git a/web/src/routes/index.tsx b/web/src/routes/index.tsx index 06032d5b..e7624994 100644 --- a/web/src/routes/index.tsx +++ b/web/src/routes/index.tsx @@ -58,6 +58,9 @@ const componentMap: Record>> = EmotionEngine: lazy(() => import('@/views/EmotionEngine')), StatementDetail: lazy(() => import('@/views/UserMemoryDetail/pages/StatementDetail')), SelfReflectionEngine: lazy(() => import('@/views/SelfReflectionEngine')), + OrderPayment: lazy(() => import('@/views/OrderPayment')), + OrderHistory: lazy(() => import('@/views/OrderHistory')), + Pricing: lazy(() => import('@/views/Pricing')), Login: lazy(() => import('@/views/Login')), InviteRegister: lazy(() => import('@/views/InviteRegister')), NoPermission: lazy(() => import('@/views/NoPermission')), diff --git a/web/src/routes/routes.json b/web/src/routes/routes.json index d4f6a12e..45e187d6 100644 --- a/web/src/routes/routes.json +++ b/web/src/routes/routes.json @@ -5,6 +5,9 @@ { "path": "/user-management", "element": "UserManagement" }, { "path": "/model", "element": "ModelManagement" }, { "path": "/space", "element": "SpaceManagement" }, + { "path": "/pricing", "element": "Pricing" }, + { "path": "/order-pay", "element": "OrderPayment" }, + { "path": "/orders", "element": "OrderHistory" }, { "path": "/no-permission", "element": "NoPermission" } ] }, diff --git a/web/src/views/OrderHistory/components/OrderDetail.tsx b/web/src/views/OrderHistory/components/OrderDetail.tsx new file mode 100644 index 00000000..562397be --- /dev/null +++ b/web/src/views/OrderHistory/components/OrderDetail.tsx @@ -0,0 +1,76 @@ +import { forwardRef, useImperativeHandle, useState, useCallback } from 'react'; +import { Descriptions } from 'antd'; +import { useTranslation } from 'react-i18next'; +import dayjs from 'dayjs'; + +import type { Order, OrderDetailRef } from '../types' +import RbModal from '@/components/RbModal' +import { getOrderDetail } from '@/api/order' +import { STATUS } from '../index'; + + +const OrderDetail = forwardRef((_props, ref) => { + const { t } = useTranslation(); + const [visible, setVisible] = useState(false); + const [data, setData] = useState({}) + + // 封装取消方法,添加关闭弹窗逻辑 + const handleClose = () => { + setVisible(false); + }; + + const handleOpen = (order: Order) => { + setVisible(true); + getOrderDetail(order.order_no) + .then(res => { + setData(res as Order) + }) + }; + const formatItems = useCallback(() => { + if (!data) return [] + return ['order_no', 'product_type', 'payable_amount', 'status', 'pay_time', 'create_time'].map(key => { + const value = (data as any)[key] + return { + key, + label: t(`pricing.${key}`), + children: ['pay_time', 'create_time'].includes(key) && value + ? dayjs(value).format('YYYY-MM-DD HH:mm:ss') + : key === 'status' && value + ? t(`pricing.${STATUS[value as keyof typeof STATUS].key}`) + : key === 'product_type' && value + ? t(`pricing.${value.toLowerCase()}.type`) + : value + } + }) + }, [data]) + const formatPayItems = useCallback(() => { + if (!data) return [] + return ['pay_txn_id', 'payer'].map(key => ({ + key, + label: t(`pricing.${key}`), + children: (data as any)[key] + })) + }, [data]) + + // 暴露给父组件的方法 + useImperativeHandle(ref, () => ({ + handleOpen, + handleClose + })); + // ['pay_txn_id', 'payer'] + // ['pay_txn_id', 'payer'] + return ( + + + + + ); +}); + +export default OrderDetail; \ No newline at end of file diff --git a/web/src/views/OrderHistory/index.tsx b/web/src/views/OrderHistory/index.tsx new file mode 100644 index 00000000..1dd31376 --- /dev/null +++ b/web/src/views/OrderHistory/index.tsx @@ -0,0 +1,227 @@ +import React, { useRef, useState, useEffect } from 'react'; +import { Button, Space, Select, Flex } from 'antd'; +import { useTranslation } from 'react-i18next'; +import type { ColumnsType } from 'antd/es/table'; +import type { SelectProps } from 'antd/es/select' +import dayjs from 'dayjs'; + +import Table, { type TableRef } from '@/components/Table' +import StatusTag from '@/components/StatusTag' +import { getOrderListUrl, getOrderStatus } from '@/api/order' +import { formatDateTime } from '@/utils/format'; +import type { Order, OrderDetailRef, Query } from './types' +import OrderDetail from './components/OrderDetail' +import SearchInput from '@/components/SearchInput' +import { PRICE_LIST } from '@/views/Pricing' + + +export const STATUS = { + 100: { + status: 'warning', + key: 'PENDING' + }, + 150: { + key: 'APPROVED', + status: 'success' + }, + 500: { + key: 'REJECTED', + status: 'error' + } +} +const OrderHistory: React.FC = () => { + const { t } = useTranslation(); + const orderDetailRef = useRef(null) + const tableRef = useRef(null); + const [query, setQuery] = useState({ + status: null, + product_type: null, + start_time: null, + end_time: null + } as Query) + const [statusOptions, setStatusOptions] = useState([]) + const [timeType, setTimeType] = useState('all') + const timeOptions = [ + { label: t('pricing.allTime'), value: 'all' }, + { label: t('pricing.today'), value: 'today' }, + { label: t('pricing.week'), value: '7d' }, + { label: t('pricing.month'), value: '1month' }, + { label: t('pricing.threeMonth'), value: '3month' }, + { label: t('pricing.year'), value: '1year' }, + ] + const productTypeOptions = [ + { label: t('pricing.allType'), value: null }, + ...PRICE_LIST.map(vo => ({ + label: t(`pricing.${vo.type}.type`), + value: vo.type + })) + ] + + const handleView = (order: Order) => { + orderDetailRef.current?.handleOpen(order) + } + + useEffect(() => { + getStatus() + }, []) + const getStatus = () => { + getOrderStatus() + .then(res => { + const response = res as Record + setStatusOptions([ + { + label: t(`pricing.allStatus`), + value: null + }, + ...Object.keys(response).map(key => ({ + label: t(`pricing.${key}`), + value: response[key].value + })) + ]) + }) + } + const handleChangeStatus = (value: string) => { + if (value !== query.status) { + setQuery(prev => ({ + ...prev, + status: value + })) + } + } + const handleChangeType = (value: string) => { + if (value !== query.product_type) { + setQuery(prev => ({ + ...prev, + product_type: value + })) + } + } + const handleChangeTime = (value: string) => { + setTimeType(value) + let start_time = null; + let end_time: number | null = dayjs().endOf('day').valueOf() + + switch(value) { + case 'all': + start_time = null; + end_time = null + break + case 'today': + start_time = dayjs().startOf('day').valueOf() + break + case '7d': + start_time = dayjs().subtract(7, 'day').startOf('day').valueOf() + break + case '1month': + start_time = dayjs().subtract(1, 'month').startOf('day').valueOf() + break + case '3month': + start_time = dayjs().subtract(3, 'month').startOf('day').valueOf() + break + case '1year': + start_time = dayjs().subtract(1, 'year').startOf('day').valueOf() + break + } + setQuery(prev => ({ + ...prev, + start_time, + end_time + })) + } + // 表格列配置 + const columns: ColumnsType = [ + { + title: t('pricing.order_no'), + dataIndex: 'order_no', + key: 'order_no', + fixed: 'left', + }, + { + title: t('pricing.product_type'), + dataIndex: 'product_type', + key: 'product_type', + render: (type) => t(`pricing.${type.toLowerCase()}.type`) + }, + { + title: t('pricing.payable_amount'), + dataIndex: 'payable_amount', + key: 'payable_amount', + render: (amount: number) => `¥${amount}`, + }, + { + title: t('pricing.status'), + dataIndex: 'status', + key: 'status', + render: (status: number) => + }, + { + title: t('pricing.pay_time'), + dataIndex: 'pay_time', + key: 'pay_time', + render: (pay_time: unknown) => formatDateTime(pay_time as string, 'YYYY-MM-DD HH:mm:ss'), + }, + { + title: t('common.operation'), + key: 'action', + fixed: 'right', + render: (_, record) => ( + + + + ), + }, + ]; + + return ( +
+ + + + + + + + + + + + +