d
zzdjd{+nm%>lr!ZNW!W@&c`tw6nvaqR4%Pp
zy=iQ4b|IXN2(wvScaZw(hMU5pC2PXA`2N0V=+;{
z@G8?_&SN$*+nDP?o@Yo{W(Lir%v2TrP>yE1>M%iB-K0#<=PY1b6{Isy^=LWO7Gm(L
z^#53Oe24R}s3;;@M$;Lz^HprNK5&2kjyOLH#+?Up!#Q|xCnT!##y|W~N6)d=>zTg3
z3>r_*Nk7;({<~E}F~8~anf`YAhvjk^IqwG2b5gBqQghPqM(_G!k3HKNYhB%w#J47U
zzLKaUoUUXKzVdgf#_*?4PvIifmlb9qvm9&?D$`SocWp18RPx{|@@?G%@=AZ~vTO1A
zP}McZKyQ_WF7%rlp|X{6QFaKK0!T6#C3c3Ka85*XxhNWr=JJtT)ct^DVq&*ByS_&B
zNs3oEf6>AX=J^v2L+j=vv~Dg6)gt+P1aeL@!%(}gwnkKCk2+m@x=-4sO|=I)aboT4
z8b-qir#n8kPpi43=OcfonX{_7Is|w%!449UF_;9Cr(B{SNF6+I?vjWeWKiP(
zrU;Iw1S;FkSHKBlqmGL1j6|G|B4d%(kHX=X$Q*9~>&~DU5|Lk$oIi4&|KaP8isG%P
zJ|Eo^UJ^!nINW**s=pF|V@P;WbUvi+-&aw;v*|ccw>i(a_WNTj1M`0=(78|(&y``<
zwy>yS2R;)_fTD#DW_L!N;n$s{FBtTpcLp{Oz|(sBUfGO$-uA!~H|1~P^aUdeI^k!*
z$U^Xwt-)>AZ*AW1Nd!IbdlH`aWi#P<03dt}AiS%)t#>9shCT<#IEy)-xeU%J%%Om)
zZtB`B?kO{$z_#P&5FdPvfC$3$aYBFYaUpvzg3b#%aa-
z;)PTxi=WPxlKIwOW5k=q>+NGdprU39cXwG
zdVuF-tQ61m%g$uBRLY{go;q3|&F7;hTlXKL3ii;<)FYv5oLhgvmU%Xm3VC!>_e}Y=
z|ARb*Pcv!w=!4C$t3@v3Lm(L-4pjaJQ3~u%@Q%p!&gVrB!k~I&*jd>*swilSq9HAW
z?gtG;@^}tb#4ky*Oh6N|&h1JXAVvvkce5QPibpc;cp#9kkt`jr-j{*{XePNbNSiB>
znLf(C6uA6a0)2lG-Q*4@6L&bYlLD3!&_d1{7!BLcwFmQHIvBbd27}qaU|iC4-h;uY
zZF>{>gzRVhOp2Mq%x5lO)-&6wbzx5l7?pVNRuBM!yIwfr?mQ4ZH8a{zT#4z*j2V)>a67u=l85
zdrwl(J(IB!7Jr*i4Ao%3Tr}#u5FL+YW9W4lDUcys4ksa67Xg;e5Do>cd@MC
zye8<69*ngd!_K{03|Nf`sYG=Yl%L#x<
zGI4Hcn{1uPSMu;MQ}*K%9{5jr0_8@sIp
z+A07u`?qWw7#tkfwB_SzV*i%4tICy1dDYtQPZL{=SgbP^GrYPU(e>f8s=EXkKC8Y<
zw639TI)7t#>s~YrExpbOuRgtwyU0CcJ=hRgupcglb+nBt*9%5%V;4*?49dS3S2cHi
zR@)Akw#Ryb;UJS`3Q$#(y5eBL4Y^SZ8ipv52|8qpagC>mRZGXZdwkK1?hNahsIRAc
z@sd@eyGLMVFsG5-9$CKeDK&t^mqF~1bjQ=O#(#6tqf)d3){6p=M<(1h&U)IMc7*PB
z`y3wGJ?gBdL!rB&!#|Xw(v1O?5Y{8UEP^=Qp%@1Ls7(DEz=KJA6717BlVg}1)lJ2j
zy2({dNvfKVJ*Ao~veP+;=IZ(@dfjj~==#_2wX%v;=K(&zzaj|EPd~i(Ta!G${lm3r
zj(^?{)pTbgRQNEmLR78b<&K~)oSZGI9dAk=^hHwpz0q?^qMKSnwPb*$5ipZk{
zL`~zPhR>Jm!pQIvRR^f$xn;Yzcw`O>QAJ*{ZsmE)u8k)-HpNOjhts~fqs?4^8-EZa
z@3ITW4}W$ZAsuPYqkK3dvlu1e?cwl(dY$Fw4Q<-G`|>q<+%K^MiV_SIylmQI_jY+~
zmdmCOuD;}EP78oP%qw;wC9nt=lOT+yN;p=)Kdq@7u8^3VH1&bt>ZFF?9
z9RrIJ@)jk`MOiX$`{89n`)hvZX@8IC33)m6ks^3P3V-dw`&aGRvUzBj<2r;`u1goU
zn6o_|N#h$vFl;Tqbkn*ux7eLiG4c`o3}_QSz13)ks89)xTpEtsn|Mh_N9&OeG}1AQ
z?j9aSIr`NBxy+PoFG0s#pCIFU0cXHZILlM|)HxuXt>aXr@R(N%D6QkF0e>Pp25IY<
z;`1qZ%;Wca(3)V%vN|jh%7#Lj@VJpM&4e)>-<)81as%M-gpyr*1YUupH>>yL>A8roaivndkfox&&R)(r8_1A}OD?
zM;o6MgeQ5+68Xm-<3%g6sK@*-2Qm_NCTCj#|xSXMXXS(sA6$jf82x%XNOyIKYn
zXnN`xP2CKa74@N^I%4Y0X5D!)97jwn9FCo4;^DVx78F3S^HMm5AS)a{
z4aK{uzMX#1Yk??zx6{_Kq52Bi4tjlQ1#Peby8Eg7?UuYqzhksy>b#sF&yaC{INjh9
z&}$nNyZ1P5d?;tbBI{riSam>rSDO~yIBc0bjrN`V_y>F0p@GfY{&nl-M$=)DM;r%>
zbpNhXlm*AzFDt3u_0YkS0AS
zg`9uWydC~v(2sZ1mL0Uuj&_^YWcv+y(^zzzJWR&gyw!~aE;Vtb7pGN!%$Wwg#04p$
zVY~cLTg3y$WX9+3zx&&F@1H;QLjTJnED=2yaWdwlNzTtrN*tCsG;zs&6QiRO_kZ{P
ziII_s`^Qg+iXuD-m?8l`Z<7?BKgYjY!Cd*D@$Y)u^?oJw+q}H&z;E#KBwxTM-6r`p
zzj(V#|9W2!`pFDrPXhUWYkWP)C&6>*-1o2W_~>2z&%svqF};9&ip+9dHCkgTu%B_)jM}mOva7~Y^je2rmg!)vq+P`_RYdA4FDb{Y
zaDI4fC?B?t8D@6KhNok$&7lj}{G4QFST{05&Y$V|P$;i=lu8|c&JWJe=wau0}0UMSKm}?p4
ztWXi5hpw)lbtN)?71p!CYQrj~_M01+&z*H8G9wCTwQWpS8Y#2Qc8q??^2F<%z1ea(
zi!aKSu^tT|)HTx8`gWqf+p@a*6X;8To@mME`>ceZ-ckY)Xy7P9Xkxn;8
zX)@@#7z|BMNU8+SiMDvSsN5#oBb2kwUKf
zRc8JaGX8SNpluntMsos#eeRk|O?v$eYK@uo%^qsIP?j
z`Yu{|<>G^XSJmrR9U4&$WJC>Q&ITqa?uq?ag~LGG{nMtY4qW2Y+a+lC+=`25m-??d
zc>BSt`q45&{e>C`Kw_kQ?S72uyTd133=6<6_rq$0shhN*YvcEVf!)4jt(~*Ba{?#$
zjz{*$Q5{J~<*58Up69?p`NqD#-M{~Df3|f~V{ov4v1#kRtJbV6RVt;GYrZ#4pijQL
zN7AG6QAzq94;~H6p(ft@>d#)?i)jnD>8WSVYT^>^yl*G(lU-mpq(M(H9G`{*-NY`l
zk?tB0t}#JuVdmA{H_!jmZ(KKT-gVzNb|<{{zLr1y$TN@JvUKU>qt84txfFH&W$PzK
zEN0+;2&6)4y54nnK5*w=+_mQLvSpL)`nNpt+@-h0>=-m?mH@d**
z?GMoHg|UJj3G~~})pmcseHV2K?@Bg$LZP02M#a4VbCdVrPxOiKz;{v!1e9%5d_E(g
zKv*8TlLzaJxt1db+l!-k*Jvs2juaXc+5iA}oMT{QU|=v{=w;wy00AZ-<^r?-2!r_y
z02~DY-m_gFc>#Zl=+S2dj{!abLq?2QWsP+<*kp@scGzW)eGWL}h+|GT<&1MCTyV)1
z*W7T+9rrx&$P>@J5c0|!5nB20b@5s1WY{v)Iti@B#$82&ma{GqyF}7O6C0UYr00bZfgl7kY6B{-yMMj2=0}!Bin(Y5W0zE{v
zFVHWcI;sa*+9e}kR>nwg)Q}W(R+ZZP`*#4y2nkXL&RFX^oUrUO(aM3jjnCkYC%mY1
zgX9I-&ox6Shv&EXe*j70N*Yv%HK(AW$dtAc#9C-C-80a=5a&}-KQ2ob=F)s`E^v|I
zI^FvlJn(<7-aiLs3I#OVlTN^Zbv^75YK1G5f={#nSe&aP
zFs8x`(vIytkU~352b{GJgYVSd+E{X+S3}{B3rX4oW4lnVrENHZLiq==`Yt>FEg>{q{7E~V(LAekV1`~{VSLrgHjOUF6~KXm60Nx)vPR+IdxFLQTGVj3kW;{T%j3)0m=6m;1P0xC&&Yyp&^$QK5$Kl0B9sa0Cu2=
zf`|dwg%S!P1z-=#fPE+j4xoa9D1jTMsDSFC24DkffK6xwtkWD=qXh-A1Yng`zzVH_
zW!eHuv;(HJ2WE5t=5z!WbOI)H21azDAg%z6=>`nxt|}ev)64U-^1D{rd~iAjuQ-db
zNG1|*_$X2;txy75sTj0GnR<~(@y=3LPnfkNsg)54mS=J*PZBc2vWXlDMI!uzsAt)h
z3fz|;6+%y_S{ipB$if;(2cyL9#*hs0QI>e`Gw?~gK&%x!9}3;xo;?z(@w=TE6-y$*
z1KmRSF!YF^p`qzuI7(>7i?o9wzL|8t01qVC-yS%~bK&NwXw#l3UWu+~XlZ&fWNk18
zJx<_5;W%|=qR{=NskcC+hC+=bvEd#*j*sw-{*iDa{a~^uwE=m$)zW8?*8c1%6k?mr
zy=ko3QlFLU6M77>*F3H-Yt;8i5Y+RRhHJIA*tKP{bd_FSz>8Os4SR4cHsaL$m&RNl
z#PjwWF`*^U+YfbfP)7i%-92m(VzLd|+XX{_6aZLL5_ff|Z^mP8LZxQw9f~<0#IHT>
zJ%Sj~V|JuoEd$yP0ua4>kn3jUj$^OH?XDkJFP*zz)4h{(9b;N%YokdS$;}*(t39dN
z)lU8U$q56Om^?jYQNc*{o^_E>uB4g9Dd81E(7KAU_pF&0^SA%$`g&Sblyd9~CuRt_
zw%p~m)9$#f+15w0M`b&kq-E|}%T(HgT)DYd%Uty%3kfk@C2lUoH`TfxyzT{$>)wgV
z`Iyq5t#n9*a+A`RslXpKFs}!K(S5qRJF#^Hw0JsDtVE^7#%0z33iRM}G%1=!Q|*b`
z_X@Z8;IUWW6sW#`=|iM@Y#V`D2(m!aiJT4*}vKw3oOYgOK|f4wsfc=g$m7o)R>U
z|J3@~hga&j_Q7TP(N&)WA74}HGb`8ejb~Tc^Xoh0=5uSGuvzTTEmBQRI5aVpIdb$=
zXG4DT@SU%QOn9EA1z;jUskQh)LU
z)2{^q@W)RK$aN*#LmdJlS=2B%xP*{dw24&^xZey1m&8y!l4%@)YarXpWR%MR(8?J&
zotOXBsx*marl?XY@xO_e1)r-X^T>Zh55QTLV+yA%?C1K<fjDL#Gu
zKU&6YJH@KRds>0}=)M7-y2Rsm{}Og!#Kw$vdD?z}FkwJ@=y#qPSm9VU*?|^C-bjR#
z0kVG|bMwsWr|U4!+%SW8&Vk(|Gp0gX0fU{vhHnRjxb{phAH`kx`fyP^d{(*0svo{>
zF2?1)?t74yIm1zq*QX)>wN>^L5dC+RPW_;{1`h4(py3W|k1LJ;}0}iHDdv#;XfPPLg~$
zUbqk3l-4u6o!tqpoWZfqd1>{Q<(@(o3v;LpCC}&$VOR@?N4yf)ze8`stT*cJM
z5knfYGTEXyI&SCFDgEX~vbc_vm6efG95qGG6vjqI$A7tO2*oe|^WIh&)lhWg-!C7f
z`v>S90LWeK9Je|6798W`!2(1@-4aKqWs-sK-@lmZ@}Rc?V;ZrM&P?ufBEsf|@P{nh
zM#+0c1gi>NQyz6Px=kj=GOCElLjd{ExjPQIVY)osm=TOQyP0d9nr|}IkL#Ia!Sdq%
z-E(M^!v<6k44f>E-gm8(ZW}Z;|$>HZKfnqD%%a-{RTW9T8jD!WQpm
zz-7qzyDGEoVVMxx!`L(tN2o@B2b=Q{n7xZqtJXi%6Tu3O{**CQt&h3@*d8m19Clt?
zrrcB!5#IRyNr;=v*_X{&gw?VM8zXw
z<4M&?c6hqmJ9i-eK&{{2)E=Z)D@#(+w_LrZ3X+Ig8(H_BX=1~8?{L*;MVfyG)yjHB
zQPl;)%ss?YjDnP0B<#NFv2z8fdh_gardht%%$#{vWpw=J+&p{#GnV%}3iYsox{?H`
ztPF_=>2@3!XE`v%Z=ak$48ggUjQ`SA`oZPevHFKszNRm&-IVQ}=T9ND`fUD&C`wci
zQf*F6qh-9!s-)se3n!U|W9tOenKa6hq1a90#XWHeg*KBasQWd+B343F>X#=(m!gDc
zf~2TYw9ww|pX}$Klp_=qvqAhMzl0nhoaG)1Zgkb*%GWjl>KB
zGUDoDfr>-=_c)DQUkVllt7x(J4wK$+!#=4KIf--Fstsr~9YqcC`A7PDv)zZy*#hAf
z>ec1{;VL8Ra`Z4wWB+mAC|M)N6hV_yvNC4)#Dq-s6HS7GWhdQmOuh)sa-o<^?7u>1
za%N6uPnI|OJ^Si6-U@;9krD4aL#PjT9v2dybi(CLkFH<1@T~FCTSVs*qHxD?H#D>R
z_1aG*;K5d*vrv;8a5Kkms*>7J?WysLi*KM-T3yZLuY40w9fm@q7`^KXstXSsIOWp4
zocN$?d6q2T5OJTmx_bY?Tep%^|Gj4@UUu?oOjP&4aIm!BH7qFoo6Yf*`wg%^WiXpq
zSheJP&V|8%K}g{fpzc~D?oqC(Z>`%H-&-3=0`d4?27oCDUJ#t&d!!Nbu(plrZ>mHt3
z5!~Pt?WNOuM|-D7R2jNKOiT}}GC`dyl15eQ6%q|6Sp`-S5qFn*7pIKct4Ye-Z*cR-
zWT5eq{G
z?&u@*{cXRu{m7nCG9&wk?S1A$3v%eMhz5vA?A}Z4d2fKmJ<2Ai*fNiC#)1EsJ+yiI
zK2wRb$7klzUO`eE-}wKC`TmA9|1wZLY3^Q?a)h73Z!{SE=T3p8q_t?pQQoO+_1sA1
zoH`-1zk_MB>s7OhDs{A2DH8>h7k^kOXF3a
z%BirvDWK2e=DLp*M%qJDrWHqOx5mX8jH~E;Y;%78!!!mBv3>$f7s64=@^tSgu}HS8jE&7};_xwf{5K=L3Fyx@v_0@=e_T56?}JetibA;i}QD;V*ZgR}#f
zxc>p#LCj}Q@k*N1o!a)3@GymyA^H%_Tg;38Ao2?SIFGyB7L7hWx`sQ#>{;R^aON!L
zI13V%vne)y|8;GRfC5;Q3@roI>F9R4M`WbfH9JN~)E=z;sHA2(3NtYeEy~?v
z=p;Q)!xf
zP{Q`GcH>#Ut_b`N2?c^feu66qmh%`((1ooOl7xqm#Qf5jG>u_k2$)CsmCixaoF<6R
ztMnji@S>r0cLhdG$N*s@n;*u7pyeMx4XndFP}*-YC^2eM0HpkaO=y4gLfS+YDC
zQ?{&Z&M1GhxOkKVBbiCUFDUZ%E|P@KpD6nm
znRjy;GoSIKcqr~>-Y0M{uH?zHA9xG1K;E4RM
zSWyrjUZ5!cOvEQI2rpKA&dAYQlqH!`qeNnqW?l#sPi~ZCN-t=`#fzw;UhY{bn+SY@
zlE9~XJs=ctqqhLqNpzCk9bw6c^^NlOj`oeoXs3+#`cv!_|K4#*dxmeUcT}`@jIS|L
zU!m1j=-aDcc9dw>kJ46XaVu9dR@c`bf=Cbo;e<1vKHWqoVXZ4x9L71PX&Q!yn;Aex
z%vul@%CCv%&hcfE4eMGiShKbqcZYJWxGG#VLUu-R_vDk0UXt@M97h;FJV
zgY7~QE1gkU?IDjIJZxhV0ttuE1ThQ{+t@xu3<%1(}GnB
zD*Ih_yMfa1FLM?*593_85I
zf>1*|{t^2zKHB*+`;#+(LR_TK0|XK#B9od<6qS=P7HWnzbtv}?q&YGGsiFDuX`#6@
zLJC4(<%cp6mOI^t^66nOZ%)3fDj~+>_Ms=C0d^s-m6Y>PEI4JLHi=S*9Q|HU#8izL8pI+Nw&(pz5a0j+zb%6CYq3GkbnLC>XuXjLg
zg=A{JUZt_pGG@36kr=UlBZ0>#Fqm$Ty_MbG8yS$@#gcon;8O;cl?9lH7}j6{mi7Ky
zq7IlkgHD3ZgkpdqupTU^zI?gn6S(w8)fL32h>i9UDU_Fne*`6p!f<)vl;ZzN!2wJ!
zCLUn=FyKHsK&_1Nm9{N55DkmkGz|F)6bPNayuaV<4&2SPwM+281K^j{S*nw%>i#_r
zz+>=$z$F$E=ODY1ScDNa&&30GfalWJpQO*BpIlF`3@}j!;%l>2+iGez>2?Y^rRp34
zPDHd7TL1HSJEjjEi=<N#?e+F)pxznce=3OS9lumc0ac5Ir(`T
z*7jrDzLUQHg|%bZi}z8WbiNamY#Hhi&S+!{a=%26=ZHBCGiE7eG~xJcv0%z$F?apk
z*kt*%R*vAqq)1QUq{pe3D8_Peg^|K#>X=-=p0lQ6rGcVEw^qNB`$ekk=KGoIEzI4e
z-mdbJT}<9D)h{r;S;!Zrq7aysz-N&0!0PR#)p|W2uBcj5%w9vqYpU4IlJQE$U>4LI
z$4%pB#zsyhXVY~$dJcJNWNapH8t(U+n$>hZo%5TZgRZA{=%GV#a9^ab;e!XUH*BP~
z8(2H`SsS_S8Fty}mc(CgxA_Oh(~}N|h)l@22uW4Gd`4K<40*w8A)|fA0{N?qGJRLk
z_1uE=z?6W1lt2SG7LXp0nljlCm><(1D=G?USW3k3MwvDal0p-NKt>>80@8d?d4=Nb
z0*1hjhooS|#L!@6hmNjjX&sKm;#ebO1;@nMdl%EGqvBDj7YLw%gr&YwK0eXD
zGD#{2nIQA35-$~3c@f2C@g@R^K_YD8bd4_H5VAWGnZreXTGvxNS4)6QR~+moDieRWJ7=dNPiFT&8LdSXA8y7?^2j_
zB%8Mzj#j2AI9q@NBL8D*?4si~{7=`h_T(PtU$l!$kiBI+
z?FBwAJZFOIg$`vKPki2{^Vg*Rp^tbRoNuJ*R54nOzB*LYkx+ug&x}|s!oib%is!)q
z3pBNVGz0*|d2=NWN9sxQ
zwm8NFGxs|qW#-kv5WX}2)~_b$Pq)E>pIe?i3SOpB6V;u`0JXLnQr%zSJy#^e7nD7q``Yg3vF3#!Yh
zcrT(2pS6dS6or{fJ@=dANVq&lzgb872fAF~%h+f~98vre`aiq=aiKWGcpg~QbP%Bb
zz!qhu{~TxCJI&Ia{o1P^y#NHJ|E+R`8x91-?s5QUIoZ8o$0`4aW5Zw)QEM(78e=X3248Wi_L+<1Owx~nF_oh@
zzI3p0XB1@s0hVF`0G{d(b76>j=E6b#We8IBapnZo*XJU+dd5&t{c|pk5k@G?ndkOj
zH^Nk5!Lol==i?w{DEv&{vD95kd4u0bOO1X8rkx&p!~v;_kmaZ3N=YVZ?Ae34eb{v)
zn`mq>S7xQu6j_!e6>a8Yzq%2o3JWIt_l{WS;~=kGC4YGDSn4h%M&;Y4MJL)bXMo9O
zP#(2`=|Vel#^tBvlx9nY7-^$D^I+T9y$_GfMD`lY-yKs`!kZ$Ndu5VUGn?1@6{nNI
zi*WLPW{4$@coIk?i8}u#^cn5bfMilgt<@XNR=d;f9rg#q(RebQ%@@nndUJGqa(Z@t
zad~y^_&{lo;NV7a9x(vKDKL0`qkV{n)M_3V#e{eh!K?7kxxMRGW24idsXLt>akmcx
z!njkF%3CcT`!u*;<1~9vophYy`y&;n(mQ
iH|}>aRz)*-hMzJVUAKw4i(^bWhicIXdo_`ERx1D&Kp8&(
literal 7152
zcmVFLEUoQLw)^cx1d~J}kphX3nfIM#Qp-{@
zDHx_R3m9yVr&}N}3__9pBi*O;ch8vYa=@_{A(Jd|1`_-GdVqil@&D;8TWb-zyN-ju
zOVJP)eVTH>a&AT=*^(D5>qz#|EbG{NA>xXf5u$z!&TdkJkm`_j*XMX|9fW$P_pJFZXb5{4Dadb(VUcZ!+^JX
zxNojbw9TZ#=nmROllN&$GhQ`_&*?jS$yXo#+lV$%BeOQ?eYtb))8jU)>Pqs{OMa(=
z!Vxk^;8L^R@PqCAL3Y@MXkD7Octhc`J_+53guVzX{8hD8<+dF;hM|$Oi>sTvF;XVm
zIyE!5u(Yzav9+^zaC9=zQk1sRncmgYSDO2;8><P
z0~QbuSV96|1&M$)Bmp*%4A?>nUkZK_S;v+RJHiEBiqNpN~V;x4P7sJ4u+JZ2HD6$bUu0zM#)xWk4
z+<*2NJ81+8E#y4ChTrI{;*5Y|3r~hb{R{mnMImCq5&N)#2f@h`L2m!qYRZvLcGB-e
z&rJsrG>VRxS)ngZ+q(TpfOHJ8gxpSoF_#^1T4;Ag?m>;q6)f
zo!l*-a5LsaUo-9QEEAayh6ulT2%wUj-u*((DSUh4+NE`x9_~Asp4N(IPxmU5<^6kd
z>Y#hzL`MI5Zq_7qE-%d6OfcP{Z(XER%dkA+3NM&~R;bD0fK?GI%YPI;Ur-gLk^RKa
znnHO?`TCaYwgmm9{>`ObvQsix0~~3^<`$vccw$H^-n>N)Cq%C*{6sx>M(yhH%VGR?
zJ>1*8oK;3j&9qc)^eV%}Ci+%`hxAx5pFHpRWd7_G&==}ZvGdJ7hg4aEIM(Bj@tkOx
zy&d1qJOvDH*!=>Uhpo4-y^HmbFOsj}>>T9(S0fE_4Lf}ju`T6nAKUltTya+}Hd&*$
zimqdpKp|?E-!aVJzx6U)aOiBKgIE;7`)SDQAQ6i@@LsRKQd7(FM9Yy2p&Vvvm~S=s
z^4j~zFytzx)WhzsJGqk2Hm`0gwKL!LFkg6p)VC%f4Kco-2I(;b{xW?~(x38sPEdkT
zJVSodM)-TB9rY6vXjw5>V4X~L
zyD!S4--=@xbsrn;3rXXccdN3!9UVa`*~~NnQpeb;In=HS;3v~3busCW6k8|JD%c5&
zMdf|~vdbp%D)OINmL}Eo6jM4S{@e3@@yDvgL;4rhV{jhjguxjP`@Xnw0rLUGeBBF3
zore%swQL&v>SVnF=A
ziXR86e;#xY}=4%|bQo9$VJ_tq}`v{&!~=*vlWrX&xu;k~JQ
zh&l3zu!=p(D;{yn229wt1SQKvf|wYoCz(~nAxzf7{(Fl}9VRVH1fptUc{rD&(!7me
zj=71l-+Pa@XdG{E2raxE^4wgVWMA;-ndD{U=y3Vvq``l%yuGu3q7-Iyr$So~Pf%Qc
z%QvQ>n8N7yj;#MMR@9bP#6%11q!jGk*SdBkSKo8^HiE3|dS0bgDi$T%U`nSWPKIb%
zm+Ns1PJ7;r#>5ph9MYJYg=aQ1qYHw-i=}pH#>7yxnpsbZ
zJ4O2|twycajz#_c5Q&6iCC*bMrP?Ilo33Y7YI5z+&Vyb~;}p8Srv#M1^!
zw1|EmJIh2Oik7%4*|AVPk_Kro6?-}Vco?YhjHKfWfH`ZQazt8WgdZbIA`
zjRl;=DxRx9-AEJ{k+MrN3W`&f2rOZGa%$#>`-YJG{NJx_wU21n
zJNVD%e}wHFWh)TURdkAFfGnYDFdi&OWz;qCbymiRqv-X;)C-Rr8!)X=2kYDd`&S}t
zZVG?Eb{uTHDk4Oc=$i7blhGYI+m%sCOx^;>Q3o#^^2Br#?DT%YmV%k*3Q|HL5zteJsch@ffy@PM{iU4)Z(Y_Dq5vOpjDB&kU9K
ztE|~)Q@Iq6rGb-5u(ujq-Sjdz>X)QEB6(eQy>WQYj^s_Bk@l2!NElQ{nT(%*#
zguE^S;=eRaxg{ea3FGGvA#P1)PpN2E%flk*A>9RW`rOV;rf0wHu;^n?j|SwV?6YJGW8OT=zAkB*YX$6B{kK@w4Glk;9$7BS63PoRD(
z()b+JE`>Ew)dj+=HAE_ARWc?CTiZW&xhiFEUVK_N8*B8;g#neb@!q+6aos1D+=i2b
zyrr%rAvRV9M2vOEkCU@9nBtco&cCC?m->p)b2nSxx!&2`efP%a?75S7Wv9LE9L6UG
zDtAOtVuIjq@jDu8kVW32O}I*~{%`%p*XY{z=L6D{_rKKb*!=2xK>P2wWxf4Nux#K}
z@x6EO&OyQ}cJK#fJS%EbIYVVleHbjEY&J2{=-y-*Jo=Hs-~f%
z9ublzR(cpkO3F+taE}Vi^%Qu)0g~g67&=#A%djV
zv*BTHTms4W|2oRYKk7zGn;%>~ckW5kgSU+CM|l39M;&eHy)QR>CbdBXhn0=7%(TGXt#@ea${M;yVJ%+xF&t^$l(HTVngON8a%tMnNo&-Dns_t&+WqFK-8X%isJJedKki9xM}y3apV)u##jFoW$_B
zBxFQ6N2%c#F4{XjZv90fov`8ZtS7ct)LD;@^Fm5PfJOVz5|wU$e#Or+XBBgUswS?r
zR^O5jq>J@?j?*|UH`h13xUD~Lfh;p*4rfnC`82c2NtEI`>Fdjn*yFEj6rK
z*9)Se`WRJl${c|>qDHHbNF>3`GZXNb+vM9Axz}AokQaW1SwuAQnu&|xUw?(;-lI?9
z$A=5=YYewf7Dm=GIj4byXL21E4r6P`q9aEJ9$0ZoI||Z;{jOpcLOOzY&s6U^jJ<-!*W$lDUT~EmV=TpPy@?TWLwKsawW_g7l{QwTsTytC
zS!MKAN?X~jl!)K_nd6@Q*PGJWgL9Ajb2dnR>pkn8@&;gQY2ffJZJ4&d?6;P0Sp{VU
zS>G&gBkx*}O?`pa!FYV{ZhYTc9X#z^K0`*AJ5SU0{YUSkEZXytjHf(2wTSWp7Gt>j
z|A#I1)}?rtgBq`eyA|?rZW^~qr}JJIibzUnRSP5Bl9|ed;qnFbLT0}^Q|31)=D${R
zX4y$I#iVDyp}TP++`w|jze!t#9mvj^A>f4Eb-P};m1J`1P!FvhLO3CItsX=;zSF!k
zQ6kHn%;k=Z(m;5=a>JHTrLr%pK765UZduqo`TvEC25kemE%~>&WukqXJ2x=ZEXmZn
z1^zkW%yj>(z)M0#gZ72r*gmyuleq#eWER2|P4+XtJb|+$O)llzgnpw1&(BY
zi(NB$0!evFr0lV7NG{fkQv7^V{nAPz|43L;wh}zk`a)>PopmXm)y#~)#PUFLhkP{S
zV0+EaiGN0w_@()#rugYaP|Ao1N2C#P_S!(~8&t|aDC746*+IVZ(5~CX%=OGte96Te
zkGZa{6i09-;OyYaA{^1#JZFxXN^ow`F9hdb8?2_qqV`kvq2l)YDEm>TtYHmBe3{(x
z9d|#8ktTQ-$?4!kz7x1QKc1)UZwe+J9$wELr}r&)<=L@1Sa!U)RZNnFJ9L$07hA}G
zG9UvcIZaK&O&Y45>KyJVliDOfNYw4GU8o{w%+6(??wjPhrfd_m92Kjef*h4lw;!Ys
zR5hulrZlOksjO6L4$kbX{Lv>
zcXe-IY8d@@pY$`YA$<%rbHnytZlc;vDHP7HRJTy;>L^{+Za|J0WbDE+eq7>t9^mtM
z2RwO~Acox(gV%$u;uH7>v5)b&J|T~$qw(lh_@(ZV^aaf@m(GQomp8*A8qrq-KMo5}
zyV2z@%F(-B4|@=d93#O4vRfFKwN
zojt0ve1=;xSb8MMF*k5piJ(b+=Bbw13_1@>-^1B
zb3nkAslYcd(9HcX=FB-&n0Q@Vx6yWHaRaZ^&8<`vw0NfcU+co_E9phFM~2au>xI9-
zk(jbaPrhL}RP*%osHESO#&+hA^KSDlUMvj_6=^2QxGW1+))?`&BK@N6!R>{B4VlVv
zg;_2Zi%XU;_Z$%(y~UE{k}Et%@k~rd$`GGJgN9|~3D?WIq^&qEPLAVJ?JNiaZ0|JylLRVZ
z(g`x9MSDcJxkY+JrFD{~`@Kn%B=7!dQfHb+v|B`^Ta<@BTwAGDS86-6V3Rn}sa=(=
zRAbhxqpfRbH~GiSIG(dLcq
z&s)Et0&|OWTd&a(b$AheB&M18YX
z1Ko{@U_^x&=9v%0P!pk8WQ%;>e0d8p#+y}3`Fl*3*}P<}jLdwK)wHB1hNAo_P!-q>
z>8+~dhOm<2u(I$h=N6s76pjP#1lX`0h9Y4JUji$yE-y$Ii+#X+h>f)S$oyaj
z;6QsZd=Iil2#AE{W2F^Dl!=_CP9DuU1*;AX!%BFuG%qNpAh0;-MNtqF!8zN#FU=3$
zzB)yc>bNN9n+F~R`A%BN7tx348N)ipe2RZrz>0j;KMZS!$Jv6DIf4v+>+b@+F#V7)
zL!g@#GWa=yQ`wY~U34xPg|G-n&lhi=yz+R<hA9x0K|33(67WF;Zel2F5cbHF}SKPncW22fyMDzI4-*|(cfiu9atT)vJQ#C__4#1+Y0LR9c;1^)K3SUYP
zo|}yYP5{fMZaPj~Ks~;RTIFD>AK0zSQtYg)+p76X$SFnlC~zR6u2FlR#!jLJY@@O7
zRI>FNa*VmPLxb1!{me0x)zdlZw$&4>=qC1z1I8frE%
zH#|CnlZW}awsswrOJ)7U>!NC@U0Udo?OzuuJpKOt=xY{2`!)0=`bj&n{Rw*7>88LR
zZ?*Xg$5IoNy<|-IvmsG+k+dKX+o}o8+ehM|@L#
zlaqXOennA@lG4(^#uY>iZ<45EU@<&{^P~CUW?F26O+5RLjdG(=zOi4v323bTP1~kTeSX!|mt6(vEiI!lhc&IO
zHG1^$!q&F2Xv~Q=LSAr0n6
zXcTV65oiS5R#wl%5*D6ayQfFI7e{1kKhPZd3MJrvpq~6j`0WYm2adoj-}UNF?wUIt
zt3UUJ8AULyi-_2?NoNI3$P;x#L*qkzz@vyPn4ZrU+Pz7lQ>~etT}ae2&VRlr;Jje_
zf!%k?RG0NX{P**D7$ERIqC_t{YQcVYnCeXIv-?3gzudaNystCC`-NkNb2!%}Z|4Zl
zS~T9O)L*n=4+Dzy6pbQEt6P~b-f3WiR8}ynC%V;H3G>4T>lBnU{c;G%WBTug
zpxU5cp&L;B><<76vN408u7+mPusR;4-f2}4oPN~5P_W$NE~KsiWnnU4DilJ|k^x{Q
zV3m-)4YV})iGz?c0QD#6BxI+^Nr$00nEp@)M7#e#Mxe;Lu+L>__B^Q0r^x#x*5GM_
zkeC*Q=_@>iesX3ZcAmpupmB)ue`tlkd*qFVJbT$El-<9pE%|qMK^Vcqz^eO$0R2C(
zC^!8dGb`I_kZ$aURp@aMYgYdnqGHS@695h|`)XhJ)M=1eXglyqaIW
zKFl`V7(5HB_*x}$lxRdVTG5WqfAF~d7{nj+KVUJ={lRcFo=j)+#d5XYYZL5ee7hYTSL^IU_-jO8NTr1sDHbXjLlfRu*f9unZ|Nyz&3o-b7Ex4
m41H@*4RJiJV=RkyOpG*SM5-QA^_axCbOrUg6<^dqI@$o`zS!FU
diff --git a/marking_app/lib/common/model/job/job_favorite_model.dart b/marking_app/lib/common/model/job/job_favorite_model.dart
new file mode 100644
index 0000000..c0181fd
--- /dev/null
+++ b/marking_app/lib/common/model/job/job_favorite_model.dart
@@ -0,0 +1,33 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'job_favorite_model.g.dart';
+
+@JsonSerializable()
+class JobFavoriteModel extends Object {
+ @JsonKey(name: 'schoolId')
+ int schoolId;
+
+ @JsonKey(name: 'gradeId')
+ int gradeId;
+
+ @JsonKey(name: 'graduationYear')
+ String graduationYear;
+
+ @JsonKey(name: 'className')
+ String className;
+
+ @JsonKey(name: 'count')
+ int count;
+
+ JobFavoriteModel(
+ this.schoolId,
+ this.gradeId,
+ this.graduationYear,
+ this.className,
+ this.count,
+ );
+
+ factory JobFavoriteModel.fromJson(Map srcJson) => _$JobFavoriteModelFromJson(srcJson);
+
+ Map toJson() => _$JobFavoriteModelToJson(this);
+}
diff --git a/marking_app/lib/common/model/job/job_task_item.dart b/marking_app/lib/common/model/job/job_task_item.dart
index 1cd83ff..316c4ac 100644
--- a/marking_app/lib/common/model/job/job_task_item.dart
+++ b/marking_app/lib/common/model/job/job_task_item.dart
@@ -107,6 +107,10 @@ class MarkingTasks extends Object {
@JsonKey(name: 'className')
String className;
+ int dpcSchoolId;
+
+ int dpcGradeId;
+
@JsonKey(name: 'teacherName')
String teacherName;
@@ -148,8 +152,14 @@ class MarkingTasks extends Object {
@JsonKey(name: 'canGoReview')
bool canGoReview; // 是否能批阅
+ /** 前端自定义字段 */
+ @JsonKey(name: 'collectNumber')
+ int collectNumber; // 是否能批阅
+
MarkingTasks(
this.id,
+ this.dpcSchoolId,
+ this.dpcGradeId,
this.className,
this.teacherName,
this.isFinish,
@@ -157,13 +167,14 @@ class MarkingTasks extends Object {
this.commitStudentCount,
this.totalCount,
this.finishCount,
+ this.precision,
this.objectivePrecision,
this.subjectivePrecision,
- this.precision,
this.canMarking, {
this.progressPercentage = 0,
this.canGoReview = true,
this.finishTime,
+ this.collectNumber = 0,
}) {
try {
progressPercentage = (finishCount / totalCount) * 100;
@@ -174,6 +185,11 @@ class MarkingTasks extends Object {
} catch (e) {
progressPercentage = 0;
}
+ try {
+ precision = precision / 100;
+ objectivePrecision = objectivePrecision / 100;
+ subjectivePrecision = subjectivePrecision / 100;
+ } catch (e) {}
canGoReview = totalCount > 0 && canMarking && !isFinish;
}
diff --git a/marking_app/lib/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart b/marking_app/lib/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart
index 872261a..4afc93f 100644
--- a/marking_app/lib/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart
+++ b/marking_app/lib/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart
@@ -249,7 +249,14 @@ Widget $completedHomeworkView(BuildContext context,
child: Row(children: [
Expanded(
child: InkWell(
- onTap: () => easyThrottle('go_to_homework_report', () => {}),
+ onTap: () => easyThrottle('go_to_homework_report', () {
+ RouterManager.router.navigateTo(
+ context,
+ RouterManager.jobReportPagePath +
+ '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}',
+ transition: getTransition(),
+ );
+ }),
child: Container(
alignment: Alignment.center,
child: quickText('查看报告', color: Color.fromRGBO(118, 118, 118, 1), size: 12.sp),
diff --git a/marking_app/lib/pages/homework_correction/index.dart b/marking_app/lib/pages/homework_correction/index.dart
index 722f730..8b64eca 100644
--- a/marking_app/lib/pages/homework_correction/index.dart
+++ b/marking_app/lib/pages/homework_correction/index.dart
@@ -261,9 +261,11 @@ class _HomeworkCorrectionState extends ConsumerState
flex: 1,
child: InkWell(
onTap: () {
- RouterManager.router.navigateTo(context, RouterManager.jobPriorityReviewSetPath,transition: getTransition());
+ RouterManager.router.navigateTo(context, RouterManager.jobPriorityReviewSetPath,
+ transition: getTransition());
},
- child: Icon(Icons.settings_outlined, color: Color.fromRGBO(44, 48, 63, 1), size: 24.sp),
+ child: Icon(IconData(0xe63e, fontFamily: "AlibabaIcon"),
+ color: Color.fromRGBO(44, 48, 63, 1), size: 24.sp),
),
),
],
@@ -466,7 +468,12 @@ Widget $reviewedItem(BuildContext context, {required JobTaskItem jobTaskItem}) {
),
GestureDetector(
onTap: () => easyThrottle('go_to_homework_report', () {
- print('子级点击方法');
+ RouterManager.router.navigateTo(
+ context,
+ RouterManager.jobReportPagePath +
+ '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}',
+ transition: getTransition(),
+ );
}),
child: Container(
padding: EdgeInsets.symmetric(vertical: 6.h),
diff --git a/marking_app/lib/pages/homework_correction/pages/job_list_participate_in_class.dart b/marking_app/lib/pages/homework_correction/pages/job_list_participate_in_class.dart
index 3842766..bf0e50a 100644
--- a/marking_app/lib/pages/homework_correction/pages/job_list_participate_in_class.dart
+++ b/marking_app/lib/pages/homework_correction/pages/job_list_participate_in_class.dart
@@ -4,6 +4,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart';
+import 'package:marking_app/common/model/job/job_concerned_with_student.dart';
+import 'package:marking_app/common/model/job/job_concerned_with_student_params.dart';
+import 'package:marking_app/common/model/job/job_favorite_model.dart';
import 'package:marking_app/common/model/job/job_task_item.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/index.dart';
@@ -27,14 +30,16 @@ class JobListParticipateInClass extends StatefulWidget {
class _JobListParticipateInClassState extends State with CommonMixin {
late Future?> _future;
-
+ Map favoriteMap = {};
bool isRefresh = false;
@override
void initState() {
// TODO: implement initState
super.initState();
+ getListOfJobFavoritesData();
_future = getData();
+
Future.delayed(Duration.zero, () {
print(ScreenUtil().scaleWidth);
print(MediaQuery.of(context).devicePixelRatio);
@@ -47,6 +52,17 @@ class _JobListParticipateInClassState extends State w
super.dispose();
}
+ Future getListOfJobFavoritesData() async {
+ RestClient _client = await getClient();
+ BaseStructureResult> result = await _client.getListOfJobFavorites(widget.jobId);
+ if (result.success) {
+ result.data?.forEach((e) {
+ favoriteMap['${e.schoolId}+${e.gradeId}+${e.className}'] = e.count;
+ });
+ toUpState(setState, () {}, mounted);
+ }
+ }
+
Future?> getData() async {
RestClient _client = await getClient();
BaseStructureResult> _result = await _client.getJobListParticipateInClass(widget.jobId);
@@ -175,6 +191,7 @@ class _JobListParticipateInClassState extends State w
}
}
+ /// 结束批阅
void endReview(MarkingTasks task) async {
/// 结束批阅逻辑
if (!task.canMarking) return ToastUtils.showInfo('此任务非该账号任务');
@@ -252,13 +269,102 @@ class _JobListParticipateInClassState extends State w
void bookmarks(MarkingTasks task) {}
// 数据快查
- void quickDataCheck(MarkingTasks task) {}
+ void quickDataCheck(MarkingTasks task) {
+ RouterManager.router.navigateTo(
+ context,
+ RouterManager.quickDataCheckPath + '?className=${Uri.encodeComponent(task.className)}&jobId=${widget.jobId}',
+ transition: getTransition(),
+ );
+ }
// 查看作业报告
- void jobViewReport(MarkingTasks task) {}
+ void jobViewReport(MarkingTasks task) {
+ // RouterManager.router.navigateTo(
+ // context,
+ // RouterManager.jobReportPagePath + '?title=${Uri.encodeComponent(task.title)}&id=${task.id}',
+ // transition: getTransition(),
+ // );
+ }
/// 查看学生名单
- void showStudentList([bool submitted = false]) {}
+ /// @name showStudentList
+ /// @param {List} taskId 子任务ID集合
+ /// @param {bool} className 班级名称(不传此参数为主任务;传此参数为子任务)
+ /// @param {bool} submitted 是否已提交(默认未提交)
+ void showStudentList(List taskIds, [String? className, bool submitted = false]) async {
+ ToastUtils.showLoading();
+ List students = [];
+ try {
+ RestClient _client = await getClient();
+ BaseStructureResult> _result =
+ await _client.getJobWithStudents(JobConcernedWithStudentParams(taskIds, isCommit: submitted));
+ if (!_result.success) {
+ return ToastUtils.showError(_result.message ?? '获取学生列表失败');
+ }
+ if (_result.data?.isEmpty ?? true) {
+ return ToastUtils.showError('获取到的学生列表为空');
+ }
+ students = _result.data!;
+ } catch (e) {
+ return ToastUtils.showError('获取学生列表失败');
+ } finally {
+ ToastUtils.dismiss();
+ }
+
+ showModalBottomSheet(
+ context: context,
+ elevation: 10,
+ backgroundColor: Colors.white,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.only(
+ topLeft: Radius.circular(20.r),
+ topRight: Radius.circular(20.r),
+ ),
+ ),
+ builder: (BuildContext context) {
+ return Padding(
+ padding: EdgeInsets.symmetric(horizontal: 2.w),
+ child: Column(
+ children: [
+ Container(
+ margin: EdgeInsets.only(top: 14.h, bottom: 10.h),
+ child: quickText(
+ '${className ?? ''} ${submitted ? '已提交' : '未提交'}作业学生',
+ size: isPad() ? 15.sp : 15.sp,
+ fontWeight: FontWeight.bold,
+ color: Color.fromRGBO(60, 60, 60, 1),
+ ),
+ ),
+ Expanded(
+ child: ListView(
+ padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w),
+ children: [
+ Wrap(
+ spacing: 6.0, // 主轴(水平)方向间距
+ runSpacing: 4.0, // 纵轴(垂直)方向间距
+ alignment: WrapAlignment.spaceAround, //沿主轴方向居中
+ children: students.map((e) {
+ return Chip(
+ backgroundColor: Color.fromRGBO(239, 242, 255, 1),
+ avatar: CircleAvatar(
+ backgroundColor: Colors.white,
+ child: quickText(e.studentName.substring(0, 1),
+ size: 12.sp, color: Theme.of(context).primaryColor),
+ ),
+ label: quickText(e.studentName, color: Color.fromRGBO(80, 94, 110, 1), size: 12.sp),
+ );
+ }).toList(),
+ ),
+ ],
+ ),
+ )
+ ],
+ ),
+ );
+ },
+ );
+ }
+
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -276,6 +382,9 @@ class _JobListParticipateInClassState extends State w
),
body: MyFutureBuilder.buildFutureBuilderOfSingleInstance?>(context, _future, (value) {
if (value == null) return Container();
+ value.forEach((e) {
+ e.collectNumber = favoriteMap['${e.dpcSchoolId}+${e.dpcGradeId}+${e.className}'] ?? 0;
+ });
bool thePadTerminal = isPad();
if (widget.completed) {
// 已完成
@@ -286,6 +395,7 @@ class _JobListParticipateInClassState extends State w
bookmarks: bookmarks,
jobViewReport: jobViewReport,
quickDataCheck: quickDataCheck,
+ showStudentList: showStudentList,
);
// 已完成手机端
@@ -385,6 +495,7 @@ class TabletEndCompleted extends StatelessWidget {
final Bookmarks bookmarks; // 收藏夹
final JobViewReport jobViewReport;
final QuickDataCheck quickDataCheck; // 数据快查
+ final ShowStudentList showStudentList; // 学生列表查询
const TabletEndCompleted({
required this.genderName,
required this.data,
@@ -393,6 +504,7 @@ class TabletEndCompleted extends StatelessWidget {
required this.bookmarks,
required this.jobViewReport,
required this.quickDataCheck,
+ required this.showStudentList,
super.key,
});
@@ -467,7 +579,8 @@ class TabletEndCompleted extends StatelessWidget {
color: Color.fromRGBO(104, 136, 253, 1),
borderRadius: BorderRadius.circular(16.r),
child: InkWell(
- onTap: () => easyThrottle('OneClickReview', () {}),
+ onTap: () => easyThrottle(
+ 'OneClickReview', () => showStudentList([taskItem.id], taskItem.className)),
borderRadius: BorderRadius.circular(8.r),
child: Container(
alignment: Alignment.center,
@@ -475,7 +588,7 @@ class TabletEndCompleted extends StatelessWidget {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.r),
),
- child: quickText('已提交(${taskItem.commitStudentCount})', size: 8.sp, color: Colors.white),
+ child: quickText('已提交:${taskItem.commitStudentCount}', size: 8.sp, color: Colors.white),
),
),
),
@@ -487,13 +600,15 @@ class TabletEndCompleted extends StatelessWidget {
color: Color.fromRGBO(244, 244, 244, 1),
borderRadius: BorderRadius.circular(20.r),
child: InkWell(
- onTap: () async {},
+ onTap: () => easyThrottle(
+ 'OneClickReview', () => showStudentList([taskItem.id], taskItem.className, false)),
borderRadius: BorderRadius.circular(8.r),
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 4.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('数据快查', size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('未提交:${taskItem.totalCount - taskItem.commitStudentCount}',
+ size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
),
@@ -511,7 +626,8 @@ class TabletEndCompleted extends StatelessWidget {
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 4.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('收藏夹(${taskItem.collectNumber})',
+ size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
)),
@@ -573,7 +689,7 @@ class MobileEndCompleted extends StatelessWidget {
final Bookmarks bookmarks; // 收藏夹
final JobViewReport jobViewReport; // 查看报告
final QuickDataCheck quickDataCheck; // 数据快查
- final ShowStudentList showStudentList;
+ final ShowStudentList showStudentList; // 学生名单
const MobileEndCompleted({
required this.genderName,
@@ -595,152 +711,25 @@ class MobileEndCompleted extends StatelessWidget {
children: data.map((task) {
return Container(
padding: EdgeInsets.only(top: 11.h),
+ margin: EdgeInsets.only(bottom: 18.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadiusDirectional.circular(10.r),
boxShadow: [BoxShadow(color: Color.fromRGBO(0, 0, 0, 0.15), blurRadius: 10)],
+ // border: Border(bottom: BorderSide(color: Color.fromRGBO(238, 238, 238, 1), width: 1.r)),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
- Padding(
- padding: padingEdg,
- child: Row(
- children: [
- quickText(genderName + task.className, color: Color.fromRGBO(0, 0, 0, 1), size: 14.sp),
- Expanded(child: SizedBox()),
- quickText('已交:${task.commitStudentCount}', color: Color.fromRGBO(104, 136, 253, 1), size: 12.sp),
- SizedBox(width: 16.w),
- quickText('未交:${task.studentCount - task.commitStudentCount}',
- color: Color.fromRGBO(255, 86, 86, 1), size: 12.sp),
- ],
- ),
- ),
- SizedBox(height: 13.h),
- Padding(
- padding: padingEdg,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: task.isFinish
- ? [
- Expanded(
- flex: 3,
- child: Material(
- color: Color.fromRGBO(244, 244, 244, 1),
- borderRadius: BorderRadius.circular(20.r),
- child: InkWell(
- onTap: () async {},
- borderRadius: BorderRadius.circular(8.r),
- child: Container(
- alignment: Alignment.center,
- padding: EdgeInsets.symmetric(vertical: 5.h),
- decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
- ),
- ),
- )),
- Expanded(flex: 1, child: SizedBox()),
- Expanded(flex: 3, child: SizedBox()),
- Expanded(flex: 1, child: SizedBox()),
- Expanded(flex: 3, child: SizedBox()),
- ]
- : [
- Expanded(
- flex: 3,
- child: Material(
- color: Color.fromRGBO(104, 136, 253, 1),
- borderRadius: BorderRadius.circular(16.r),
- child: InkWell(
- onTap: () => easyThrottle('OneClickReview', () {}),
- borderRadius: BorderRadius.circular(8.r),
- child: Container(
- alignment: Alignment.center,
- padding: EdgeInsets.symmetric(vertical: 5.h),
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(20.r),
- ),
- child: quickText('一键批阅', size: 10.sp, color: Colors.white),
- ),
- ),
- ),
- ),
- Expanded(flex: 1, child: SizedBox()),
- Expanded(
- flex: 3,
- child: Material(
- color: Color.fromRGBO(244, 244, 244, 1),
- borderRadius: BorderRadius.circular(20.r),
- child: InkWell(
- onTap: () async {},
- borderRadius: BorderRadius.circular(8.r),
- child: Container(
- alignment: Alignment.center,
- padding: EdgeInsets.symmetric(vertical: 5.h),
- decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('数据快查', size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
- ),
- ),
- ),
- ),
- Expanded(flex: 1, child: SizedBox()),
- Expanded(
- flex: 3,
- child: Material(
- color: Color.fromRGBO(244, 244, 244, 1),
- borderRadius: BorderRadius.circular(20.r),
- child: InkWell(
- onTap: () async {},
- borderRadius: BorderRadius.circular(8.r),
- child: Container(
- alignment: Alignment.center,
- padding: EdgeInsets.symmetric(vertical: 5.h),
- decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
- ),
- ),
- )),
- ],
- ),
- ),
- SizedBox(height: 13.h),
- Padding(
- padding: padingEdg,
- child: Row(
- children: [
- Expanded(
- child: LinearPercentIndicator(
- padding: EdgeInsets.zero,
- animation: true,
- lineHeight: 8.h,
- animationDuration: 2500,
-
- percent: task.progressPercentage / 100,
- // center: Text(
- // '${getDoubleRemoveZero(jobTaskClassItem.progressPercentage)}%',
- // style: TextStyle(color: Colors.white, fontSize: 8.sp),
- // ),
- linearGradient: LinearGradient(
- tileMode: TileMode.mirror,
- stops: [0.0, 1.0],
- colors: task.progressPercentage / 100 != 1
- ? [Theme.of(context).primaryColor.withOpacity(0.1), Theme.of(context).primaryColor]
- : [
- Color.fromRGBO(144, 224, 190, 1).withOpacity(0.1),
- Color.fromRGBO(144, 224, 190, 1),
- ],
- ),
- // linearStrokeCap: LinearStrokeCap.butt,
- // progressColor: Theme.of(context).primaryColor,
- backgroundColor: Color.fromRGBO(232, 232, 232, 1),
- barRadius: Radius.circular(10.r),
- ),
- ),
- SizedBox(width: 7.w),
- quickText('${getDoubleRemoveZero(task.progressPercentage)}%',
- size: 10.sp, color: Color.fromRGBO(70, 70, 70, 1))
- ],
+ Container(
+ padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h),
+ alignment: Alignment.centerLeft,
+ decoration: BoxDecoration(
+ border: Border(bottom: BorderSide(color: Color.fromRGBO(238, 238, 238, 1), width: 0.5.r)),
),
+ child: quickText(task.className, color: Color.fromRGBO(104, 136, 253, 1), size: 14.sp),
),
+ SizedBox(height: 4.h),
if (task.isFinish)
$CompletedHomeworkProgressBar(
color: Color.fromRGBO(76, 199, 147, 1),
@@ -766,6 +755,73 @@ class MobileEndCompleted extends StatelessWidget {
marginEdg: EdgeInsets.only(top: 8.h),
),
SizedBox(height: 13.h),
+ Padding(
+ padding: padingEdg,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ flex: 3,
+ child: Material(
+ color: Color.fromRGBO(104, 136, 253, 1),
+ borderRadius: BorderRadius.circular(16.r),
+ child: InkWell(
+ onTap: () =>
+ easyThrottle('OneClickReview', () => showStudentList([task.id], task.className)),
+ borderRadius: BorderRadius.circular(8.r),
+ child: Container(
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(vertical: 5.h),
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(20.r),
+ ),
+ child: quickText('已提交:${task.commitStudentCount}', size: 10.sp, color: Colors.white),
+ ),
+ ),
+ ),
+ ),
+ Expanded(flex: 1, child: SizedBox()),
+ Expanded(
+ flex: 3,
+ child: Material(
+ color: Color.fromRGBO(244, 244, 244, 1),
+ borderRadius: BorderRadius.circular(20.r),
+ child: InkWell(
+ onTap: () =>
+ easyThrottle('OneClickReview', () => showStudentList([task.id], task.className, false)),
+ borderRadius: BorderRadius.circular(8.r),
+ child: Container(
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(vertical: 5.h),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
+ child: quickText('未提交:${task.totalCount - task.commitStudentCount}',
+ size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ ),
+ ),
+ ),
+ ),
+ Expanded(flex: 1, child: SizedBox()),
+ Expanded(
+ flex: 3,
+ child: Material(
+ color: Color.fromRGBO(244, 244, 244, 1),
+ borderRadius: BorderRadius.circular(20.r),
+ child: InkWell(
+ onTap: () async {},
+ borderRadius: BorderRadius.circular(8.r),
+ child: Container(
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(vertical: 5.h),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
+ child: quickText('收藏夹(${task.collectNumber})',
+ size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ ),
+ ),
+ )),
+ ],
+ ),
+ ),
+ SizedBox(height: 13.h),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
@@ -794,7 +850,7 @@ class MobileEndCompleted extends StatelessWidget {
),
),
),
- Container(width: 1.w, height: 32.h, color: Color.fromRGBO(221, 221, 221, 1)),
+ Container(width: 1.w, height: 34.h, color: Color.fromRGBO(221, 221, 221, 1)),
Expanded(
child: InkWell(
onTap: () => easyThrottle('go_to_end_review_homework', () => jobViewReport(task)),
@@ -938,7 +994,8 @@ Widget $itemDataViewOfPad(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 3.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('收藏夹(${task.collectNumber})',
+ size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
)),
@@ -974,7 +1031,7 @@ Widget $itemDataViewOfPad(
color: Color.fromRGBO(244, 244, 244, 1),
borderRadius: BorderRadius.circular(20.r),
child: InkWell(
- onTap: () async {},
+ onTap: () => quickDataCheck(task),
borderRadius: BorderRadius.circular(8.r),
child: Container(
alignment: Alignment.center,
@@ -998,7 +1055,8 @@ Widget $itemDataViewOfPad(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 3.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('收藏夹(${task.collectNumber})',
+ size: 8.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
)),
@@ -1188,7 +1246,8 @@ Widget $itemDataView(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 5.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('收藏夹(${task.collectNumber})',
+ size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
)),
@@ -1224,7 +1283,7 @@ Widget $itemDataView(
color: Color.fromRGBO(244, 244, 244, 1),
borderRadius: BorderRadius.circular(20.r),
child: InkWell(
- onTap: () async {},
+ onTap: () => quickDataCheck(task),
borderRadius: BorderRadius.circular(8.r),
child: Container(
alignment: Alignment.center,
@@ -1248,7 +1307,8 @@ Widget $itemDataView(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(vertical: 5.h),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.r)),
- child: quickText('收藏夹(2)', size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
+ child: quickText('收藏夹(${task.collectNumber})',
+ size: 10.sp, color: Color.fromRGBO(102, 102, 102, 1)),
),
),
)),
@@ -1477,7 +1537,7 @@ typedef Bookmarks = void Function(MarkingTasks);
typedef JobViewReport = void Function(MarkingTasks);
/// 展示学生名单
-typedef ShowStudentList = void Function([bool submitted]);
+typedef ShowStudentList = void Function(List taskIds, [String? className, bool submitted]);
/// 查看学生名单
// void showStudentList([bool submitted = false]) {
diff --git a/marking_app/lib/utils/request/rest_client.dart b/marking_app/lib/utils/request/rest_client.dart
index 6aca9ec..9e6394b 100644
--- a/marking_app/lib/utils/request/rest_client.dart
+++ b/marking_app/lib/utils/request/rest_client.dart
@@ -17,6 +17,7 @@ import 'package:marking_app/common/model/job/job_concerned_with_student.dart';
import 'package:marking_app/common/model/job/job_concerned_with_student_params.dart';
import 'package:marking_app/common/model/job/job_data_report.dart';
import 'package:marking_app/common/model/job/job_do_marking_status_info.dart';
+import 'package:marking_app/common/model/job/job_favorite_model.dart';
import 'package:marking_app/common/model/job/job_note_taking_trajectory.dart';
import 'package:marking_app/common/model/job/job_page_tab.dart';
import 'package:marking_app/common/model/job/job_report_join_class.dart';
@@ -292,12 +293,16 @@ abstract class RestClient {
Future>> getJobListParticipateInClass(
@the_retrofit.Query("markingId") int jobId);
+ // 作业 => 收藏列表
+ @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/dpc-api/api/read/job-favorite-count-by-class")
+ Future>> getListOfJobFavorites(@the_retrofit.Query("jobid") int jobId);
+
// 作业 => 数据快查
@the_retrofit.GET("/api/read/job-data-center-report")
- Future> getJobDataCenterReport(@the_retrofit.Queries() Map params);
+ Future> getJobDataCenterReport(
+ @the_retrofit.Queries() Map params);
// 作业 => 数据快查--个人
@the_retrofit.GET("/api/read/job-data-center-student-report")
Future> getJobPersonalReport(@the_retrofit.Queries() Map params);
}
-