From 304e465b6b5aa38bbf61cdeb007f01d3448cd633 Mon Sep 17 00:00:00 2001 From: yubao Date: Mon, 26 Mar 2018 00:34:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=A4=84=E7=90=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOC/工作流介绍.docx | Bin 0 -> 47353 bytes Infrastructure/GenericHelpers.cs | 28 ++ OpenAuth.App/Flow/FlowNode.cs | 12 +- OpenAuth.App/Flow/FlowRuntime.cs | 7 +- OpenAuth.App/Flow/FlowRuntimeModel.cs | 2 +- OpenAuth.App/FlowInstanceApp.cs | 471 +++++++----------- OpenAuth.App/OpenAuth.App.csproj | 1 + OpenAuth.App/Request/VerificationReq.cs | 21 + .../Controllers/FlowInstancesController.cs | 23 +- OpenAuth.Mvc/OpenAuth.Mvc.csproj | 2 + .../Views/FlowInstances/Verification.cshtml | 52 ++ OpenAuth.Mvc/userJs/flowInstanceOp.js | 69 +++ OpenAuth.Mvc/userJs/flowInstances.js | 26 + OpenAuth.Repository/Domain/FlowInstance.cs | 4 +- 数据库设计关系图/OpenAuthDB.pdm | 12 +- 15 files changed, 407 insertions(+), 323 deletions(-) create mode 100644 DOC/工作流介绍.docx create mode 100644 OpenAuth.App/Request/VerificationReq.cs create mode 100644 OpenAuth.Mvc/Views/FlowInstances/Verification.cshtml create mode 100644 OpenAuth.Mvc/userJs/flowInstanceOp.js diff --git a/DOC/工作流介绍.docx b/DOC/工作流介绍.docx new file mode 100644 index 0000000000000000000000000000000000000000..4bdf34612821ac7640039385f77bba6853c02695 GIT binary patch literal 47353 zcma&N19WWNvo9Lkwr$(CZQHhO+fH_}V_Q4gv2EKQ{5ts_Lp%kOl^U0{G_$m)jHg=ly>lkUt+x?2Q$i>>Zrx6@J)Ieg+`^W!ta+xKIKF z0MGye06_TfY=#aFbRM=gxrzGrK@2Fv+vykF2wR1qqPdh9;rEuSGJUTWSx&FXg6mC- zC$0L4qO0dySDfr09Npp7bh_s`f~R6PE3iHnTz#1oSbD=(eA`~o%d=s3K`lYT7kYx7 zzYbm_FH#Z;WPsP|A$}XTvWd|l&Q*uSS#AGr-%Js5UC^kcA{lQmtV6t50A!~a@(9~8 z3P4xzxPx;6-@CK81+j4j>Wex97La9MXeVoLhOk!LUvN9$mwPi(kVDK7m-I~y` zc}wVh?>(XzEM#;gqr~?6kYK(W(;9CvTv*Xd9;9>Tvv1`GTWKYIzh}t7Ywcer$>}ZA z{AYaU|{ywU2YVBmt_yG7%{Nd`%{~G+@ zZ}o#e;(y2A*xt$X9|QO%$;u5fAcQ_kY!Ke@H7BDjXh~A}Euf|*Pyp38URYWqawpna zc!RLfbPDPOvVsFWVsThvMG4T>O zqA%conq%U~ZvX4Y4E{eRLH-YOxH`Mo+y1*FW+tqD3<5giTlh`Tlur7~6&ZWAuq9a* zot9*BOTx*h4o{*%Tlwu;RRaH=E}R?Z3TD0Q7vkT!*ZvcvGRQyyE4!frc~T$Viy15+ zd@kCKSqsepQLna2JNuPrX0;9m33#GHU&v{~6(Hm3X(d;_$oe=*`278Z_?1+bhj@L4V!B1dV3$hZm3|2UGZ#I+w4S`S=+6G zloHnQ>pN5;Yat8SY~8Q6&yYU7G)j;T<=cnyPiK?iAz@zFVh$m6cZLD z$q&PZqKCZQ-k9BdDAd7pyX9$B{eR&4zdISwAGqA@olO3RgUQYSU>g5%Kw`!;6ZE$ZFfCET)+^pdbcJw4h!&Vo znP>JK=uDXr?HuNxK{dnMJ06z8++~nw8sbpm1;R2(q8nwZSumo(+Bqr)@~qqKamH2M ztGy@Glt86Rf$_)^k~yki;4>#KFo=_L3pDR<1?-CrU&gbb==ixz)}xpek) z6v-6h{zW*Sqncb%FOh^YUjFp}u^?z#J-GzOdbbw4~pV*4G|$nu^6#rE|5eBJx?p5Obp zD%b(d^mgNC^75;<8P~yMLTZ$7v_eu53V{5c1p9rYTtVD{F8_0Xt>k;97LJD$8u4x$ zoySwk6M|Gdk7KvK4bgDa6*FxlkB^^%5EW%?#sB#?j|X)yJx`8_K(%7CdJ#*P7vzgl zIrGeyrXyC4PxK5%QZ#G>X9C;FWMIf}fPZaGyw42;=|m7SEyva@pU8R|dYBr*$S2{} zQ#i*d{H?No#QYb6`6r>@75wdQ)FO4GXp#eZTu62R2X8DmfQ`HyV1U;03xK}MNS>b| zFZiFKho7PJ0f0Ub(4?_|A|4hRK}QRXpt+ekkkCRy$Z?@TB$UuFQVK{|X$1tVv;v%{ zu!Lt!JZwp}k9`X=)3nhTZ%lu}0CUKI>@7INKs!H2(S3BNjlElaHZ1MQEh~}MRxV(( zwT&8pZWG>lU1IsEuFQ;MsJ9JU+8aF>9?v60mo*-=Fad$F0uQj%Ho&Gvd z{JdgC&JdbJiMI5E+Z3YZbQ?MFspOdxv_fYpC@jlr>e$0oq332$(dJ7Y%3tw77Nv3t_tkSuy5Emd2M78UAwL`59VXU0?25_qX{E+tzVF~LSf@O zD7UQ(3udKQpXR58744qALL|wN#*z)3@j+q_U^xP%Z2F=xlwbV9gZKD|JlJI(7&amZ{Rv<$QwM|Z8&+}gh7&7A{tK4 z0L%hJ^15eN&OJ5Z7QSz|^S?N{?CtQb?YiR`(vqu2gog2yMIo1C@<)U z!KaBN$Y^@V37!=lz)t9h4}sF?V-i)Gc(bObqQe5{p;3W!Fihk7B&4oMgar?Ygaq!0 zre#^&1Q<1xQoHJ;LLCs;E)6$WE)6R`uRbi7wF;!awN?i({Vc!0xcY5=0d2wvx5{r_ zE%sRzBp-Ix=hAG$a%uMbT;#)kV)AM?Gj_N6Gx5GI9Y1Y0vqkO`$Idb8)Y~tp2KcrK z5uaYSB3`5I?G8*aq&jpQvv+7fC;%@t^>9a>=|U5Vxr6o)jXsB`7bu@5#jqi^yf?d3 zl7?*ZO%4{kR)-UPw0L(^DW|F&Ul-Bn%W;&wsz>8@?lI^=eH8sSo5rgvgp2ijt@=gl z+cA%mcj^41dZ!~Z62#vcuy?<3bbp+6#fpn}H6KV*xt!lOdw?e(QFcIC18xH|Xigdo z-}-yC^;T9L$eO=8^DFK1XP{RTYAvy-)E|aVX=%!aT8Q2dvNfE(mRb9937Dt*VE3)R9Qns(Sb(q+vEZ{!p5Q4a~5YQ9W{XvbH~ZjgrB$Dk}d7ezg~y^R!2?rGcg$ z;5LjsVH7Qw{-Y(sj~f4VwQ=NsQ&|kDJ(4{Qg!l)HY_^50wg0Z=#xOSLuNlRzdYTr1 z|Ak#H-H$|uL)a6C{{ygp#UpV-wx@v<`w{#Hf7WKoA58x-fb1=sNS&asv$$8cZRcwy zSVnwGKh{)zZ*|N3ta6HhzgPFBU;Azs=WXL^lAeCKy21eGG|bbRy&bUr?>{WirtIsZ z>gIT8$opyVQpVLH6zX1JbxE^JnEoJ(ft4ZoasV84-CZy(U(4#h)U!XcAtR0X(IQpY zz2g0S!Oa@Km+Y%1zq0l9QuzT2YGLMNrX6Si`6Crj()@R&t_$t$I(=dj{A%D+m!P3lk4% zZwqIcF{*%}I8yPyA zy0}={ng1L3m8xwjuX7;y_h!E1Gx@>S3k!MU36bxV%#fw@JMc_Aku8bh<4MXv_W zK$pXgxUP{;ymzl{U!8r-Gn;qQQplEOfXqr_JO~^#6d3VB;^7~C#tX`06G07>1W49_ zG+{fSRR`+9|%=5Aky8OMDRKQXm4i21>-Vw?t2KxsZEy0fhon8#wLu59ooq9|DXH3J^&#V-R;a`TUQ;iS)9%7qxVI?7 z!o~F9wMg!<2z=~qAY15#!d6b_G#U4>UD5JuFUTy4Lfs4`AU5duc2Y}1lqsxWO|*Ci z2=S4K^!joSN+nKIh$GC9p)N*fODb7Gm$9Lj*t#u+l}Jf(hN6cQL;3)O83w&SN8`0g zZG2o8STGCShPH>4BYh4B5{=g63WdoT8odbwh%q-fbdKbPaUg2pFHZsuYs1}@nDDfk zN%-(fwZ$zvg|PF$T-1TYUD51I_2d$%7cHu9;s8RLO9%7C;^(hF?sr=k-xAQC>d_ku zun)aKNa2JW!Jd*RW4Cl`5VZ_Yq?zv4+3JKXa2HKpvg+$WmNKwMO1yMgZ>AxLiNaC8 zF?6nANgDo)ug@dX%B-S#0-8XllWbdvxo|cMmm4l!2qLcOWD>I^WbmqUWX&c0{>zJz zgB?pl`BmAhsQ|bvuw2@XsDa{E@Khr42rzvVnbja!bpKspDAtr|B{ftE)X-jwX@MRT z_G%;e)WEhqwjBZF$gtSTIxS!rMGMk3my%hlV$oh{E5VQ98qDBYj6$!05C^+kap|Em z4g_Sf7=`z^;r~>v>JZDwRXrIWM=}732ssH_YBpVGF;MaVT2}ND)GFb)!zS?>3$XRB97!*X zA%-6|zYC6@hkBnwfdxM@ct9(6=g0y#Ef?=9m;6ct^=%ctRoFaB0X3ptZaWLlxle)_ zS8QTdWBAv$gr~*(TuwKqGnv*up8G@xF^^KpOS*GaA$lZpO-E_>6>|qAL|9JCJa6@y zJM1W=o-+=4+Tw^X9va69vKp(=MslH}ab2o{y%My#r)#aj8fd{B=RWnmWpK*P^zo`_ zwxU@abPD9^v|~!Cmehe8x6Z-bXPwI0VMceFj_swwa?Mz}J435Yh?|wHUwXB- zqj?PircCJ_Er_&|iru`?l?5^bS2|IZ`6WEtX8yzE+;9S$jpw7W>nQwyO*6#~Uab#T zv5MEFNm-uz(xUA)ccY>>me+P;c8Ujf+oZE?s6{0v3U&(5zv&^>MCPiX?P*BTLBuJ2 z#$_{hR8toK2n4;V2eGmry|8=t3fJ@Y-^BC(o|{7dZx7^RVQOpoKQh$W-`7JgKiMk@ zCIA5He=`2d&iGHBdZ{UEkIjzIjeg>EOyFNAd}SpnrE-bEhaq|qJ><*mlY`kq zsILBdE56b_qMd-o^6gNXbbD|t0h9zX`|Hy0xp<<7oJ0ypL^CM+3kCZ7Y$+UHM=+ad zfbpr14>7yqR9vYn+uGU)Vo*ZIh*EB6HR2XS@@0ImIiQ&M27A8wQK_;8jX3E=FUZKj z+n9w&_@evc@_Bii|Ebk%iyNg(qC^2$c-(uOy+wwF4I>>@NJcc;=^A0S3?3Quq9XoU zdb?Oc!eiz^`fXZ&y`v$F&6$`=eFe)+_cML{5Uk%rcY174kkPVKsb--C`Ws8&kmzw55p;GI{!@~TE}>#x83t{dKqoLbsKy<0`JG`_j2>nPoGIVVTDdwX!&>) zPXFzBm-+nMc)i8*wib&{_BEZ)@BccYZbx8K#F?wU&GUKwI+!iy4DOR%90+-x zi~)Vk#dl{{kAYTJY{WbQ{AGvs34u6o#0?25m5?>O+e=Ig?duyw;k4schuhDMBQgZq z#nx_)cqQsX6gjxBhoapF{O1I2e~RLwvOR|3nOyQDFGpTxgEjHDpLpYM? znk<>_1+dXQ;tkGIU~JrFn{Y+ydCbZIyJ^0Jg&yJ2WB|9lD=bsBx0@1|u(}kiWK-!P zgM@tCoo(*3Y!?dbcePoJ+O9(6+m3s;Q4aqDk4xV1dq@erlFoTVQ6C;P1dTgWbk3ah8lE`~u|NBs7poOXs zgpTbA`j>fAK}VfVzJ`vvS=nTb$S@^aR!CgznE|m7;CQi8OkQ|j*LgFee4(gZC~;(< zK(Y5jpJpn{x=womEGt7w5c#^|beXM6fk`-p?GsUFbJsXW=n}%ULX;&0-9UJ(5!N5g zRI)w6mZXSgN6UqYH6n6oqnO0*&FWPY%c6)?#F@G_m_SFv2{s`$S`049jvO;y%!6XG z37eQ|ZdG03MTR;@zWH^ve>_Q+V6&To;||Paz@Ctz-m1GA2m=A|+I?J;1sJH71e!2= zd0WVM+;rK8yuz9STbw0UVM|elae7B<9GdG*8xeS4yT=To0x_uz5l(2)V6s4Kv*`p2 zGdxxI*@PICQ<&wLcU}o~k#&>GY?8qm7`mQEJDFW$QV8a9?&2oXg z-`L!AiA4abb(V`}1Dfp;t6Vf)=zQ6jKPAa(`?&s!w}fJv%}6sX*DNDGN-Sj**8%78 zp?BW1C;!y1+FaX=O3}?nnDr{DyTX{1Ioib~80#LYZbvV#BAQa3d`&E7Tj^Ssp@8(jAmNlD`wEQA68hJ}jE7hv^p5l`EJgsHyzuXH9D$7q7S^g5u*p{7Y%qqN_ z4Z5_slcSkCqmH(!&paL5D2-^Dm{F>ox@2z^yJPsaS`g zoJVW2<=-4}j9S*rOG3T0UuM^PV@$)cy7z92eP!fbH{hr03Po`ID4jRWmbNZPF(*7h2PPHo$>UR4>6C$?0!SZSIk8u6}-U z-LH|$&&(FuZRzHe4#QVfN%K7a73PeTqvedhS>?58nUdQY$o7Aw9w<9XsB&xNWpa1a z%e*IN^~;wp{5Fe9Uy?6VOP|KsH@)>;_3&%0eLsv?wR?}LgqfN_W|QTNA`h zv^)#8a}$p3OQia85pz`~b2_~DB!eZ|LGefLO<3Nb%ADRqt|YB$sZDzy{Q2Tz`aWF7PFVeG~4T*h>_#U9b1kTdO$z4su%fNez4z^DEkF$ zh*fqAb}o0)@%JN_6CYQ0YB96&CnMzarPL5h_n)k?>HKd}S4%e( z;@^?AFk@8V4S+||AUA_q7`vMqeKj6h!%HskSfpmLMI~Dya-OGUD}ep0!C?0u#)2B@ za}(_7a1jg9tw{}G1b<9T&qfzq;-zq$LyKT&iy0P(&2HOsKJF`fYhYbhPS2a(D%?yU zifM%w80OetX~b}KFir!|g6T$kMj~0Z=y(+d1fj25kq5=Vn;?A3>m4NbR(ykmqL-nS z#o?oO`>0R>Lf&`b1CYGo9{{%VZF;s_aS0;ZR{c(n+FY0uL=XhpWG}WWqV-9EEn}s% z$OWYWQY5G-ck`Whu2(QJd8^#QdWqS%^b{xvaX2L*(SGL_rQk|Sv&J+UX`t^pSodK> zR1%G`w&_>}1EFA)}Bv}~-WC@@jD$);RNE@zIAUW1ijG!{@Szic` zfJ`A0QXGE_%IW;;gaYx{9m}CLH2Vi-pD1Ca7>&AwkE{|sjT*4$awUL+n_8G}TC zw-<*ar*0O*R#iurgLg)=XTH0eNQ@&)Umo@W zX^b>mxIJg(jv_H241{Gax1Pf|gjrsJ4xDBf!~Qr_;ntTvT^Z|cvk}D+wymKrGJsYt|qtpZfX{1B$2Y!jt9E z%9K0L1k_P$aXs$4HQ>@l^e8$OSq0+qPz)$^8_^A$Pyt31ColsdHWZj?a31`~N1p-- zI9XmFd;w%gG31Ii@ve}Kb!XoN4I2;colA+TR$x)50FnTbJuxIA^f5sRG9jkyGQHFc z|D14?(9*oAirI=Am%f`E?>Sf=;CU6enc`YS2l`deXP(XcdaD+US&bDV2yK|hRt%v- z0*wI4W&n8wfJ?+p<|EppbMcJnf?ngeGSL@p8=Xz(f$f6c!rtVn-t4?9ubI`E)u7AX z$0G$BS}EpYmis(uW@vRVV*ObwC&uL53RJ81$S$=}xwQEs~nAA8d zzZK}x(!ZhyH)^ab;G!nv+?=yY2n-WGk|&IRAq4Ol0lGOxEVhr09E<*Fm=WdEs*sI4 z{buUFtFAbNDs|GEwkdR|qcT?Ay07AS*`hz$$NA)YH4gy@6p)|_+*vClKtOCAtEWS#2+KywaZj2ZhP-f!bpoYOM_{iZ!Rhe0qFaX00G>{P$g>h95iH=%Y#6>ni029m#0Q#1=|k#6k{m|rxdf0JvdJ#6Ir2-N#CaZ;C!t8J zjCr>Jk|G$xl$#xY@m1scwK>9>f$J3y@+^Q@!-YUx~)k%-=k3&&Q zS+?OWVz5?+dE)qa&~32A1iR)%vOOMLH|svApp@n$NE!)9nFD_oc>qb5Mxsce1dSHs zLYr|91+!_z?q^iKi&d)0y5gV$H0nYb^YL_i98H_wE&ffzg8yYa61PS(lAb=r=D1NFWa8<2{fWYY=J^D6>FSezp z>sw3-jc8szU<0f=qRKiTNb7$VOK|n9m(29es;-mdKqk843i>5>Sb!4&Oarq=4daXD zZaJ**>@(6GMwmB&A+4Kh&Ta}wywXr0AsoyLQ3zTDFto>f_dYa9HK2YU zZ9~tlAk9Z;1f=z=5L|ZDFj!1tU04XK(yw|88 z1^V?$RZmjdT%gjFR%BJetk#W^gP9tVtrit0mE&&ZgE(VCIaz21$))k4ExV#mmnbKs ztVY#v2dhSaK#x4f8AOW zhEpR=JDhJ*OVh00bIR9N=k@Gl{;KwVd$@?5-qEVgCI7Y5?YG^)x+(1(v}RrFGe+O_ zw0Sn2{!c9Fc|7to-hH#2dq}-${aw6$JE89X<^8-=I;D=jPMx05+i|OOT*dB|HK8Ta zjNE@g5jO0dJO?w)ubaxGU5}6nN&Wp z;H*liKW;wZM2J8mK5NaY`xqa#JeMVf{@UM5*PNCZ{owhV3e|b`F{>ueMLA4tTZ$47 zTQ!x79lzG^MvrQvX-IJaIeJ9rXaUxBt@N7n#(4arFLS@8W9Jrh`3^-b^{nTb;E*8@g`Ja`Va&3CCq4-;j^nB>PMnDqZOmGE^6<($+l#)g+DN!Xv@E} z55f4A?SFAk#ixG#k{@9Srq}Z9J$b*pH>!Wy9bSxvmz=$K(#*ZKcTMlHtNmEu?|l25 z&ecvIy!VN0`>wm6C;vC|_(?RYj1Wz!uRvyUt$aSX zJ%?Lc%m4np*?xC1JL#x_`uwXG^UUsjHg?fFo;yB`OCK4cZSM61oQ{!%`eCzHdfAdx z>&5l75tt9bXKOHUC*vgl+so7fBTU3#{h5slU*s+64D14_#R;;caO-tbEIh^BW^nEG zQ{;RT5PgjXeJ!=L`MDQ%(Mu^LEt?KOtH*kP1(f?Xp{&CYF$G%|*Wu$no8{4>bq9)0 zTnL+vO&gMymIH)e2Y;UW=F%Z|T&zS|*xE2CVReJQVN**h~0zm|5JFuVHx#PE5l(^}px$q`9!wfnXA ziod6L*-ql21*?YH3ZxcfOejWMp!cu=rL>FqEjHP1 zns~bbd$iRiehT>YN&A8@k%>ObXWglRL;ay>v^Ag$cW31(+Q&PuAX=seG^~2CW>rG= zfuSg1#yR-dpm)GAGGry7dy@lUfgpcnx4yBW<{w_!2Bu;E7{%!8O zUXOjOmF;G`vDG!tlIz)a3jFA#Ej3#YNgg{^B}AB4I?DFDarC9OlIyv-V7LQ59-|e@ zuO_qS(ZLfmfK8XhcF5G;|!wD)sqHyvkf$<;O{-ede4afhgVj8b#9n63dx()sg@3hS-cD`Ul(lOA&Dpx9yNICU&@g8K#u7y+Kr2K37}>vWjg5w&G2%J`UYytuuC=ll z53g$8itE0?#k@OP2=yWK=4pfBb7h%%Y`YaAnR7WPt20wqa!M!@Z6=(5Ph&lC01cF1 z!~2JcgPYwBvVJcnYJD`OqI)%4(((Avg{bVhwC_)ZW}zENR~&)ji3#QkrRG+N_w+wz8#Em+K24`xifftLRs~y6?UBC+vShGg%egq6`cGa0&we zfb;{+zZGyZdpj2uLnE7iTYDGPHtp6JFuL=b+y&b0jl%_isA>poOExcz&YP@}VKkzR zO~RS*4AeWb+}hnw@C?rK%u<(HSIo0-vK2Bqq?oIq$e+mH4|48bFZPJ#t=Uzm$Qt5; z87DH?PZ4SdVicuqO?dGecd z)k%%VBe_tKv-$@M6LJo2l;d>d4#H0lNDzI5oR-WfCysxIE6i)AB!;UX4iZYAluDH4 zn6+zOOJxa(CRQ?LR}`&XBv>&Mf+JHRRiWf$mbc)M(`cvlf5{O}AyKAa9F;p@EMJW- zmKt!19bwDoV#%-7ie)C08al^s12y4oBEfz1Jn!xAX11QVInGQjc?G5l>l~6grSAP zb=f#NJb%x{vnX_%2b_LJ>&atG4K3^=LsT%umEAkgH?Y2l5fx@C7ZWuLq5xl043>+= zo493AG+^rLH*r*}^A`Hyk%d5Qp8$XuAjDv>ejx9%+cHILMAh$G4K1`U|D%`)iSf52 zRSF_D+xY`vi()2HsrBRSQW1Ab!CJtw_`b=q?BC)uSZt$4Fo49_Fcqa#-TX1X@7|u#BzT*FXwEBg=7}LWH=Su2cu8-Sx<@w(Je*WaGy}o~kuT7ty*lfSH z-dKLr%RjGdDT7+nJZeM$QLL<_Iu$|~gL?^8&H+-VBh%#u{vvb@t~^y#P>A_ncmw<@ z@u{{t025rG9nw!K!Cs(27y_)Mq&)HL)%yeH!9OzsQA5hxm9_bc3&E*Xa{Wo~elwxwmgPg-wEz)L(-e0_C~Z&?0Tv?#kt*U zNiHI#o7M8hb@=F8>-rZ*(ZlfP>Ggd*X_Smh+_0k-|6GA#BMTNJXQvhNmi zIW9BSdr|k5K>T9meb{yiwPm515+06vw)WxOc42ZbJ>Hu{QRtdY>v{Y&El3pM?lx5E~<_q`Dq}23qX&Eso85N2Q5gQ}%+&krN|K{G6oJ-EW5W~l#sa5)Z zSQspK@=p`seBw~phGz1hxOh0XG<5U>zpaEMtVX0Ic7_N?Xswavs1={$+_^vw3}%z3 zIOfS&pO25>(>+pBQqv4rR8Kn@xwu1=Fcv*JTO&Ud)-mxDC&@U@Fi~7-Ny$rl`T^x@ z-zJN=0wY9!I`nX5V}j;bK4b&4u-sD_%V_g_td8{t>C@LfAtL0z3v_ycllG@-cV{y* z3Wonz18RD^f0~;l zlq^fVAtWOhGE@KVcjqL}8<7vQEx_*NQKiinY$KDs`Lx_qsx?0Re6QS~@$&IBP1U3! z{@$ksrYg0$ybHky8;V17{E|Kf@>A1jaddQUbsE?7i?qF2XFZY!LuNl@G*Sy&_3zD6 zul-o0IX!JgdV!Tm&~3hbTeJQMdC5T^T>0aL%{>S~Cp`ajwdug48zD$Vq`m&zD@F|N zyQ~7cgkGSA%VbM^t@SknpmdrIkiZw5;Oy7wfm*+r|iDF^Ow@Gd>jl?A3k8d9hP{Tab4p zNBjmbI+~7`Q+lk+PGM{DzR?S3*!CvoNrCaeL^^u1IyDs)f*xa*@`3_{+mO#t#|j7O zEkLd-k0ZhX@wPcC3+_nj8A;Tm9tDc7fAA@xH&S{Fhmu*`E&H8)ru+2t^fL}oz?8k@ z?$FU7?H!)H<7Sz)?sgWw0B1b>c`t>5#z9a{F?V- zZ5!AKvFk_iNZcYnZaHQ9QNoh%SvTA2uOh@UNAEUlV>a&IQlrm8`L#y9z@p+!Z$YAh zl96o7fsRjU9BJ*NiIdSm0RT)PSZzpFS2HuSsewv+XD6-BvsEBhz_Nf()Velc10>t! zk!HD8KU(Bhtv}|*<{QJmmQW1Df?a@XFQ(k3XDQLp&=`;2mEQsO9FjG8vs0P7G&7x1 zbu(cF(?wH24|Sef<1qKip{^Fw7M6|*ndtKQ$7e7Z9Hq|BBn~delHA+JUb;15m%d_D zxitGi#2t2YMum4(bai#>+}zT|P)Bsh&YzQD5YGSBc9o10TZ95XwXS?TJU$M0smV-0 zIRWMGs?Gj#I@Q(ZQIx2@o|>xw956Rq87lqti<*v&O?~@X4O1CS#JWmO*Pr+%HpLVq zz9hbT=q_=5j|w>%4fn6}n08`|ORJ*xL19F2N>5}Y7-({JErr^W^VrQ+_lh^qX)8@{ zMIHEuQ~LPW7^N^v%;QtfEUn4C{=3QQQ#DXHUdFRN1v2~X|ag;Q08ExSjm z@>lkAIiEEMW$pTt$x;1WgZ-+WjSCj4T0t)Iv;)K3QqLgw!n;ImU$FY0TbSX=0{UJ^ z1J@Roc^v6>Zr%M4RgwjX3eV0&-*kiuM)9L?MST=VPaC&3Ra$wnaBJHxT8GOu>^Xga zyOBSC`ierD_m|82%N*V40?~(gy~Q{-E@qFVm8MqT5v3aI>Iz26YYP#9CweYBAK}tI z>uz=WrYdMB57!UfeC=5!vAr@fGcQNAN8>ZJj4ytTu(7fACD(8#4-ylvn)+_G9=*vZ zNND=|aBdY@vQb+!w6;P@!q5I`@ZA1;5m(4LVr0~1??|I!ypF8FrrpGHy|OjznNn3Q z@h8^$fzhZfGI6ry{2T4nhIYg1vN_S*N>GOE=TjH#!Q11inMuLL+0m+hD&b^Iy3=1mn$68HRhu_;MX8*8`$dsV9Eg`s zJOu`0qCH?*Db??Sklm-%n(Q5+zJOajukm6-pf`N19 za`e0PSf|4U87OFkW&})0uT~aIZMLh6_pIo3+ZuBfnE5&mDNw+kwmbDT81Z7_iPgGf8y2P1zwYM)api(Y&YLHMCq zgK@jQ;Y#0&CtXx5V>B7OtQ>>-Q=RrJy-uc$!T|yYxXXP#wX^v9k*}(ZsY&!c*?onV zJcfJYUMflz|ILoh5|%AerVdliLk&yk@-M1F$45pF){*%;kcpmFcigI2>7D5H9>Ivh zenHZxaz(|MUNXt6nW@)i5hK&H94KZ>WSNU!zwDR&{Ukq?_ttl!396!o8?5x1qiZu@ za9U;>+FvXQsXjEzyCO@bm0+#Z404}g-_Dcki9`%~L?@<4+5>Rz?w^&@uXsIf1cZx| zjo)cd=2lrEiaBk*XmNR6*Aua{iFfR*(w@kF+1}Taaq>-|1mjENp7ciz&Fl@SVE$Dm zH$C&g#eHfL0gk&0@e?cZ@bqjX*(9<+W@2JOLPln0y0ShzJbWDXeIdvx&r|_ zRRuE;_RLBVJDTkKDD;O~`9efQe0}Bd>`02yEH6lSA}f7Uz3gzw`0g36LeRS93r#dH zS*V|1bdFTTQ+L`heSKVXTkiUCD*cC2H49^C(XyeL=}Rb zc%7KU!fO^WSNT0PDSi2JCQtrB{5{GtvJJv8OVQuDn!(vy3p&y2B`wW7} z291w0qu<7`-|wD@|l;R2OJ(L)tO_^WGPF65eO)qB_=l3kU>MUk`rUB&u7Oi(KD=i zd*tUIgLw7|!tv1Rr*Yh7MpL}ro}Gv_r=fE5W0kj#`6If4&EXFEpta4&&0yXEGp%0h z#v57+&poaNdM=a%3vWfxRvXX&5hHsJE)T0Pvh)Lm@?Pq9=gV??r)gRC4(D{|WDt!SV+8#aq*q zjW9?5YXegpD!HNwTjFnI$)ZwPa1J?%>X?!23vrZFxk#$1&^QI{Zipe9! zg%;2p5zS5~sIvO#YA&(QNOMmn8sz$GFAb|KPkCXo^?IFbCKmf^7gw>Td1MxH#TLj!R{$lca^T}#{dYAFlq$;Hjh@7+x6K7+YWjO!(W=S9{Yvl{v@z2Bw5 zV!ErlzTr-E;`-P5;)bY(da+dEtT8Ry>6I>UcSBlnLh*WB?G^?u5}X?5*GsVKIBygi zA!#VPGxhG_M0&0M#LFd3;9+OHCoQ@UtIa@-cuRA$Yc%m-Jt73^Wc6Mx^KSt}bqpXv zYa=Tx>u;nzGWH3@tLyVlRtjk#&}1JM9K{QdzrQc&t@)rs?eWS!B27Zixc+U+l%|o%bwCL}yci3IWTY4bKQF-<)Z$ z{HN#s7EBJ`EH@*=Tz%;2b@08$S^|IcM2cn>7lr4~k9k!He)>te{OU%mWyxt-Q$B)! z@%hC>#Kge-Y*_wZiWEi5?R8hY{eSz>IX?Y=MwkaOAp9!NSMp5E|1Eh_m zT!jo(0#b;1v`XmtfzP007az2qcmUXtq92kFI)-uFDamSU=8$dGSW2#x9$(058Z-lo z1`_-ur8&jT37g(nhE{M5mw=XxPRh9>iv|Ypt*l_2-@GRGQm6w_&Mp^!JENGU*#%%? zmt#8MiWtO5OG!(+lO6S_Yg8SR&X9F^nMMe>5I;OV{3ZzR_4hB=mT18}3tyxN+ZI5_ zO6x0^$%Ez8h_7CLRplAYps8X)69~@>3KGc99dezy(^OG%S}1Fnrs=jmzUM5gIy>XD zadfOVTa7PqYw<{JNDSPWy1Md#Jb{cq);Rcdxh+Zge*kbmkG~Z1z;_5Ze0bhWgKYcj-l4DP)wwW2wqojvSBpeSx+cDRZ zz8)RyR-V@_8Z!Clv~Dav@bfXhY0Yyg4WlSOs-J)&fSm0g7?`KJQ!ucNALdEykU&Ic zfB*h{w9?i94yT9l-MCQzy5q5+=c`@ShxhOIowvRH*nZBL@>$+%COA) zb#!!CbS*3{-r(b#^DNLm=NtKED1oEoW0Btb&!0cPf6wQsR5p@+k0)q2i3}o~Z;JwA z5D3*ACNn*~U;5tmj*jW_L4oXoCPqd+zrUqcRf&dvD)(GAhJRJn)I>TtS)on?1ExCU z8Pw9&w);^V0c?qm&MmOzVNsd|pw&kVw;0beHUgk+zJ){2y4H4Q$qUK#_xFEh>)3zx z)t)7?SqFj8JSPSKh^gRuQg@s1t4;2i27WDU?#>N&G6|v-M@s_rF>0cA#=eO#4 zou_NBtgQUx$t}mik;T#F=#NV_(R9$70G=z8_O13cE-tRQkKXN5*BcO86xRg=GJqG! zRZBdfT{=2C@pR`;A!oL@0N_bwl;-B<4xr9`i)B8ph|G(Ni=(8ZeERfh#w6w3<`B>Z zm7|wq@A5)(jc;PTZ;2aCKC0-oe+e&2x^!&x&|VeWnilbqJ0Bz5b+Kti@+87~JITXq zXUtnh1_xu5qo=kc#*zfN+%`X;HRr4{_7eKyJ-nq(fu77X-jW2?z*?iHWJ_>4Gh(76$D8 zNU7N--v_TGUmBS;sKg$09_&0*kd%S=4NO{fb+x;0v~Hn{`<%9q&tAE2EOF*xsb8H&)1dRn+!cd3} z+K(?~Snb*W6@`cFot>#@XlN)Y|LTXMi;D{qxxy}ccWdlaXv=q1M7_0f48 zrl>fNG)PTPPUdNNaeHgo)6dm)1H^Ts)(vS!{FmxjSXr0Xz3=e=b0_7yWe4m}FyR6% z%pd83mRY@0sN#m zS*UKIX_cK$U|`_xlyS?WM~^f!q-K&1pqmL`Xbcbdk`8uP4T^@`4NBlZ&bK-q-HU9l z0K}JEKRP;!$nj2Yy%b~Jl_nO1Z)V@v++?LDmsO2y?(6F_!`{41-PV_*GU^;L=}k{h z52DkiK*OS;h3yh90fCb8^5+4L+4b}jiyA!#tBvgJ>{?#-PwgK{Q$nAtPayxG-=P|J z_6rC=TIrU=WD1=5FKK{X2q0&rezSXUaIn2ywP?tp!VrhU4Hp|VN9^(68tCtzE8!9r zc0I9mX|j~p1O(z@Vg}~jNeQ0@1_nmGE}A<#JI~M0htcNrF)}k78yYgQvuCBIrlzFK zu6uv|`n4W`6iz)f(qx8et`M<=hqXDKxTU*r+=3~NAZ-T_;*KgToPVLhW`Rbyy16wV zGy#ojTuIQ>s$k&Z z3nA)jyw`DH3KS!$!9s#>T@w;A2kNtE^E`i9nb1;t*s50w;2uDTtkRx_{FhMU4Q{jD zwwXT4f+;5k?VF_A@AF?$&O;PZpBUD|Xv1Lu9~DqZ>N6nWt>Z(M+m^VKSy@?K;mid% znV#@$e3>wp6AuIjCqP;O!}2C4aU%A023~;Y%7mmU`~5uKiWLxNR;aWA=3$PD z*j`)v*$iTT`Nu!*0K;TwXXokZX=RnG$45m)l_6@MfGCq-j`LnQ3n?(IKPp!0&M!47 zflJMKqOl-aE#RIiF6L)`DJ#b#3m_QWZD)543s79YP!IH~_>)MFjEMII0}zDS8T!TH zxVgEV#aR}AvU*M2avrM!Z08yCVbp1N!c9v@M+Xj1?z5{0=vvbQ-4y<3egb6o_%_%H zuQhE00vb#O%|BQHf2CGdy6ReciQn)J3hZNGywb!RTY3Zl4LUfyA9Z4j-Qy#~;>-j` z6lr8z5HNN+;LjNt7r-cc#qeT z)Z>(aCsw0)8W-2#xt!*`ALspQ!hR^QHTn;r43S{p^!MwEJ0|umZil|i22HifRvDLM zXJ-R(0qPY*2bO=|-F++A>pT>q)2k#?Ql-6Q^hiyuN0&Y1AmKbV2!z`3u=u;4 zFcOX^RZv)osH5Tj4D|lnw{Ly7>GyL4#BI%EyI-r_zYkt}*SBv#;fSPnIoW9uwxxsX z>t$X#LN$Yyxl3c!8hlAyIMQ4i0M@;K$aBlt5i4cAe@48>G= z60^_69-@_5EQe;+rE=N1u1CpB}IgX z?+wt?v2(cAUcM1Rawqt&I^4-qwTU$Ge@Pbq70CSy*BLf(+?hanIXd1Ljv)^wF?jaSGd_62T#9jn^wS(HU(2qQm$8C3I6}h z+*;yrK#0SOs>hej#2(+iOcwg-=i?|EWByAyeYf!qplH-1cfc<#jmBUwMP#4`Fx#D> zS@6Jr?N>)40PZzEa_Ex+P~$VMCn96_%HyRIk^*VBzt+_&S6+45fbjG2?Ma_m*2E4y zQ`2I2(Yz6AJR>z#^2B;ip->o5W6{&oizkY5Vmz)u>#ueFVzhn{{QAYS1p`KKxF@J` z@MihDE({iK6?0Iay;d=s-O`{d<0!UMcWCEt>3S}YT}@I~(QYx}PX;>zROifVUBmMw zWs%j!)6>(PU%$FbWz;+&uG=eMGy_FG)vGV$=|HO7ae-I!-m9BGfpit^nqLRQ{dR&( zlb|Mr`;sDL&J*?;L?*;L$e~O;(>izFC6@}rZ#Hh0mN~kGRpZOVIRW2*7n#+%TKoF? znwYSdBqt_If47spaUC;LV;$6 zF&N{)GHUkMuXZcp;RM>x%8OM+?iT^6#T$}CHn~dmh%(zkvlGX`1TRemz~?e?>6E-3P(Zy-@mT^)W0%AfE$rgiGo48OFc1N1q#F zxB{!yR)jV)-228z99!c;@ zTyfN{?Zs73GzejU-jB?U1n7810l(2H1eOl?6O{3l;VlOu(Pd?2UQ!vref+s{nX{!) z=TQE5PfLOJdweDY)d_##LdZljT!_aRC4Jd7D#GhHvuD=qEB^Ou0+}_ZVy)cc(&$8U zZ0z=GgF(b1fB0HQ1eeT73NcFlEztkF2LHS4Wj1mgJkNQezuD;Ng$G$lg5QixPEJmb zopz67260DNc(|B^M9lFU4(QGlK)dqt@|E#+s}FR$23Zl$O$FK4tgi#F5NZ5xstNx? z<75C>Vr5fhp|F^3Zj{CoQIFA(<+xCg*m(J+T-0!}{N{_WTP`Jx30>HqG;Nmsg0 zY90TlcK_vpXU>CyMHsPcQ4{_z#S6eGy-$x1$w%>&_Kxfefp}igFsJ$ynZv}DG2re% z&2kS&P8z*}ee1z@IzNB@1X0@ZtOs~^y-zv5dcjmpq(|{;G;~uF6EaV5EkMMQzkhJ# z3akMrTkXmN??Do*d0GeaK-Lpad{DAKZ&)mwtnVGn<9|%pZeMw!O2Kpg6!f@b*;6A= z7jVz{SN8U(kE!kudUYcMZ(yTS{kr(Qpr{uFZ@ z2Jan7ohj`l2(*Q?v@{=|1K8Lg^hb<5jgB6}1RPY^51blyt2KRQ-3~qEIO?Hn;e765 z+%e>tpszq3a5Q~g<5Vigv4tXoM|05*ue)m@*+_X5!G0h=JR*Ymd;~FAPc}hvhEar+ zgJK*Y_-MtTu`2t$y}cgU-HC-EP)h*Snv3R2v|)#bhj+X(XhT3^cK&6}HP^@xfA{Q2 zoBiFO?~DXRZwH`T(j{C7<5Pr>Rvq-P_AJ6y0RX&~FJC^88I+p(Y!4Y^1rhdS{dUSj zGpLVAiHd-9+Mq9tb|b~ub@5duOWR%IG_ad74(}nfwaZ^V-K^(#Vz2yt_>y(fM{*k21?zY@td!ZC^Ok8T$B7b6;cLEX`5 z7YNcYTB&4)3#b1iq$efK=!XZ*W_VF>D(dHPf~CbsTeQM64U1C5Tcix*SWK@7W%|4S zS&SkW#_)z&Idt^!CTIyIDwQqw`qipo$LhfVF8=Sw|emuJ%3%9u#5G|!bfpXfKwI@py~iBpl^11*@@kSItfA@gY+=f zjf_bVtK{RC{KxY&<5Yqh=4`GwnWu4AqSK`d`^B8rSYSUs)bnHIarfU0+$i8iPN zr(ELM<=Mc@*Iy?j9PV(#D4xb}3ANGX#hN%BjR~^A7QCb`B<>e!qxkY46w! zqs0+~HgMMywjMm1U*gqlHdRni@b^CiT^JoqyQ-1QZ&oKNCzq*NZUIg@Y;JD4)XpS_ zgoGGX+FZSQ6|Cz1gl8NSz-uV>`Vn_r@h|C)#DNaqMJlcPT4r388WfzlT=NmO> zF#pF5xRo{00Xt6C`%Hg{i;0frA_2ycgCYT(Lc4>x0i8ZGG?~4kusS3=j2#7HdArO^7%BV)v(?q9{&3q(AVoH`R2S<5CZ<1qLRSR?XW zA<`c}^W-SUE%f}cHd{;bMuTPbDvLa)^RgnA<~S_kdED+!FOQ7O;l@noRM2W=%S^c_ zxEBc0Km-V&eiUedTxP7nPlBkxCq8GL1~NF2gMx^za&b%|WZ{4tGKqjpM6QzqY8OsQ zy?-53gPmkQ@=E@+0%IUlBG8`x6RBEMR5VHrL8qk^Xu*lI`D=uHFkIq+GvU-&LHIyl z-%qpx#gkf7*V@;tR&A{;An@Z!^w>`>j^m&(tEStfIXRjaF)i+17c;&LN-i0hkH)L0 zq*W!pH@Yj*hJiC1QSs$*$7IiLV*0RGC_ritL27q3l}cd`L;eF$O9KQH000080EbTE zK+Yld8thg805V$u02KfL0C#V4WG`)HWNBe9X>DO=Wic*rZfC{(byQpJwl@riQmhnr zFHqdwOAE!dP~5$^yB4QFaSK-5U4s{QcMBTa-QV=S&)#S6ea;!<`R5y7N1>yEBx|j# z>zY5CGfYul0_6?i8vp=+A|?4*2>^hJgMOVOzJflIHCsCX{Rh@jMCvOdBI44z!W#6y zNOqDMjsO5^_n$AA1O`+h0N@=!>hq_sZfS=ro?n$++k_u)*2|ZWUia}DD*i_P;OFlK zgS?Iy5ad8WSDUyITTk;dpd^t4yP#}`_9?-@r=FzfLj56rkzL+7S6YIa6g$ggoRXJ9 z1sg8$%X@m5-d};aHs3$0kC92e`}hi`i|YD9Q>Uc*Vq_KEiuJ+k=BV|>dbP#j`cSC8)+3TD6O-)xdH(MNnVB+Rybroa z=-xd8UYGBJcfGVrjUlF|C?a|OIB6F6-rV3&L}kf&!V@fSleR>p^JhsD3EF|tML$QGFhv;ARG39Vw+R$MgbRHf z+H>Vw@~UQtaRpe7gyz9Z5kqwBP0Z=c$qw zYX_nai6&UGe$m`0B#fBPKsR*x3W5(G86;6*BeeDu>7S}00ENM%T{2Dh3|>^Z&nMvy zmwc!z`fLvILD{B47qcry&1Aj`TU^g!?57_h7}CC7L{+i9Hmu?xj{Xv9Do7cAfV4_~DS_7ZOLkmBq&;&JY6HE=u0BqOWB?tC zTxy#|-b-RzHP^0=_Y-ylU5ATg@4SIXC=8?plZ%$of~c6848CwB0Fv`jo8IqzZ{)MKUX7O`eJdbSv-hAZ|fub-0D9n^HG zXj4B)FUaVn)nYahNKDSInySC+mYDzhmyRU8R-i1tW2Tl>OJi$pD+z5`LiJA$Apl@o z__4A?b>VfT&XJfaP6UU0##S(;5xkC@kl36_);q8 z+#6oBDfOOWasf{(OO+GW$ld@t&v5vtZDk}%;|;lvghCe=Zv7?xC4)M{EVI~<&B{mt znFF%(*-{LLGW@9|bO*+~%i~!c79kS}3Cm%VgKadiprCAphV#BM%Rs?RYW-mzO7n1uiJ9XeELJS0A?FA-mJ`Yj{_!5c*LqnN-MKupuR}U!7b`G( z_)XG?SzgQ?#*@zUQ+_ds%X}zC*yAhrq|Jajwe_Njy$`Pv`M0kEz#Y zTdfUm&}?vh8dC>x$&JK}{w&I@Qp7*s|JTjs?-ge>%ekYGAra?A0Qkl!WDOFIw7hjq zp@A;Xb4J#Kgu*iC)arfKp^I;mvdZAj8?5pa>JL7QqQ$P^b$$CSJM&K=z3cg8G!;qg zoBnsgHDV1S=TCUeqf+XCuY8V z5pi3q1et~0z=mwt-9&~CK`|i5<}m9I&%DX+1L)kSF0-QLEJ;F!24zx?tLtpNoM!S~ z(P|GjWGBV9c)mIo9=WVyEtU$%BIm#^|bn@vJoOUIK6mtu>HwNRi-yjz6pj% z?-+icHlI5Pm|hoAAq%<*io4$D|338gBU6(0@MycQ)J^9bQUteYaHX&Bl(Piz1of9M zo)X6|SVb*dEdjf0>H`dE8C!7K53 zc#U;8(G@khclb@H`Zor;X2G9BRDsFAZ`GI|?w)PXhR~KPV8&-MR2JNvP{3r)z%N>g z>eD~rVhfm*pbI6FWJMq?r~>Z7r^TyLgeU7HT6L+etIh*0D(xkEcM}hR?1dsww)(6> zJI(y9wnzg_@U`3*!D^D5JXAAHw+#U{=14eCw41phN8bn`1YX|0$Ni&`cDe22JEKvf zmCqev2b9=vf;yAld%mc0NTpK;?h?EV&g2FPf=0JtJPJq_w`brsBwp!B6d)bal6NL=E$~m_S(PZtc!1MUe%<#%Y45u-6tmRHjZcHd!)dzw2S=+w-1w;QNi}Zi&QIuX6~eN zGRr$Av+h_T8Ay;eOy@`cWQo4tW@Zkt?L$t#w3u;Cymd6Eaxxc7b3hMf)%;S31eA^i zd_->zNweuBik zUT)%F_JV?lxV!SK6Ewr)oK_9s`tSmXyd#wdMRACTA!WOn=l7`~^v#m*u5q;@;n*A}xr2wT85f*C=Sw-tuXgD2(;2~ZaB;rLa|helZW^~? zfHdAQF&%JnKTIT>T81AVlhp}VjiAkEj$FfE(kIEu4r}TgY^S|gEC`qAF+`{rpsN!>OF)%w@1d%srr9^kVt41k-n5i; zioN89SZK_{>hAEx=Q+t3=2+&daJ|%}E@~9k=@N5hA=kZ+NdGkVGaXO*3Vm?b!9z?} z)zKa)FlV@~UNm*t%It1l3vA{4LNwBz)ZLOv*SzeDXf19P(NMDXlHcT|m$1)-iOr#ZRd)7jd?7@5(GfkvY?n{NTh&CS~*NeaaMBPT>#BW@o$jhbq; zIh{J3b?!gbEjx3ANuq%jl!4J_tYHKGkKX1V&btaYG-=H5VE?V6J;dYXLN{rmJU-Zu zcH*m^C8ukq>mkiWRv3mbg$^(scbAcuugOFh5x2*±NH8T}uq^M8~!+25RIlr68b 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 literal 0 HcmV?d00001 diff --git a/Infrastructure/GenericHelpers.cs b/Infrastructure/GenericHelpers.cs index a8a9eaa7..284ff92f 100644 --- a/Infrastructure/GenericHelpers.cs +++ b/Infrastructure/GenericHelpers.cs @@ -43,5 +43,33 @@ namespace Infrastructure }; } } + /// + /// 把数组转为逗号连接的字符串 + /// + /// + /// + /// + public static string ArrayToString(dynamic data, string Str) + { + string resStr = Str; + foreach (var item in data) + { + if (resStr != "") + { + resStr += ","; + } + + if (item is string) + { + resStr += item; + } + else + { + resStr += item.Value; + + } + } + return resStr; + } } } \ No newline at end of file diff --git a/OpenAuth.App/Flow/FlowNode.cs b/OpenAuth.App/Flow/FlowNode.cs index af9566c0..12062339 100644 --- a/OpenAuth.App/Flow/FlowNode.cs +++ b/OpenAuth.App/Flow/FlowNode.cs @@ -8,6 +8,8 @@ public const string START = "start round mix"; public const string END = "end round"; public const string NODE = "node"; + public const string FORK = "fork"; //会签开始节点 + public const string JOIN = "join"; //会签结束节点 public string id { get; set; } @@ -21,11 +23,6 @@ /// /// The set information. public Setinfo setInfo { get; set; } - - public FlowNode() - { - setInfo = new Setinfo(); - } } public class Setinfo @@ -33,11 +30,6 @@ public Nodedesignatedata NodeDesignateData { get; set; } public string NodeCode { get; set; } public string NodeName { get; set; } - - public Setinfo() - { - NodeDesignateData = new Nodedesignatedata(); - } } /// diff --git a/OpenAuth.App/Flow/FlowRuntime.cs b/OpenAuth.App/Flow/FlowRuntime.cs index c4667aa3..a4f6d94b 100644 --- a/OpenAuth.App/Flow/FlowRuntime.cs +++ b/OpenAuth.App/Flow/FlowRuntime.cs @@ -181,11 +181,11 @@ namespace OpenAuth.App.Flow /// public int GetNodeType(string nodeId) { - if (_runtimeModel.nodes[nodeId].type == "shuntnode")//会签开始节点 + if (_runtimeModel.nodes[nodeId].type == FlowNode.FORK)//会签开始节点 { return 0; } - else if (_runtimeModel.nodes[nodeId].type == "confluencenode")//会签结束节点 + else if (_runtimeModel.nodes[nodeId].type == FlowNode.JOIN)//会签结束节点 { return 1; } @@ -435,6 +435,7 @@ namespace OpenAuth.App.Flow throw; } } + /// /// 标记节点1通过,-1不通过,0驳回 /// /// @@ -446,7 +447,7 @@ namespace OpenAuth.App.Flow int i = 0; foreach (var item in _runtimeModel.schemeContentJson.nodes) { - if (item.id.Value == nodeId) + if (item.id.Value.ToString() == nodeId) { _runtimeModel.schemeContentJson.nodes[i].setInfo.Taged = flag; _runtimeModel.schemeContentJson.nodes[i].setInfo.UserId = userId; diff --git a/OpenAuth.App/Flow/FlowRuntimeModel.cs b/OpenAuth.App/Flow/FlowRuntimeModel.cs index 9f4f57cf..ffb005c7 100644 --- a/OpenAuth.App/Flow/FlowRuntimeModel.cs +++ b/OpenAuth.App/Flow/FlowRuntimeModel.cs @@ -30,7 +30,7 @@ namespace OpenAuth.App.Flow /// public string nextNodeId { get; set; } /// - /// 下一个节点类型 + /// 下一个节点类型 -1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束 /// /// The type of the next node. public int nextNodeType { get; set; } diff --git a/OpenAuth.App/FlowInstanceApp.cs b/OpenAuth.App/FlowInstanceApp.cs index 30f0807d..601e5d75 100644 --- a/OpenAuth.App/FlowInstanceApp.cs +++ b/OpenAuth.App/FlowInstanceApp.cs @@ -16,85 +16,7 @@ namespace OpenAuth.App /// public class FlowInstanceApp : BaseApp { - #region ύ - - /// - /// 洢ʵ̣˲ύ - /// - /// - /// - /// - /// - /// - public int SaveProcess(FlowInstance processInstanceEntity, - FlowInstanceOperationHistory processOperationHistoryEntity, FlowInstanceTransitionHistory processTransitionHistoryEntity = null) - { - try - { - processInstanceEntity.Id = (processInstanceEntity.Id); - UnitWork.Update(processInstanceEntity); - - processOperationHistoryEntity.InstanceId = processInstanceEntity.Id; - UnitWork.Add(processOperationHistoryEntity); - - if (processTransitionHistoryEntity != null) - { - processTransitionHistoryEntity.InstanceId = processInstanceEntity.Id; - UnitWork.Add(processTransitionHistoryEntity); - } - - UnitWork.Save(); - return 1; - } - catch - { - throw; - } - } - /// - /// ʵ ˽ڵ - /// - /// - /// - /// - /// - /// - /// - /// - /// - public int SaveProcess(string sql, string dbbaseId, FlowInstance processInstanceEntity, FlowInstanceOperationHistory processOperationHistoryEntity, FlowInstanceTransitionHistory processTransitionHistoryEntity = null) - { - try - { - processInstanceEntity.Id = (processInstanceEntity.Id); - UnitWork.Update(processInstanceEntity); - - processOperationHistoryEntity.InstanceId = processInstanceEntity.Id; - UnitWork.Add(processOperationHistoryEntity); - - if (processTransitionHistoryEntity != null) - { - processTransitionHistoryEntity.InstanceId = processInstanceEntity.Id; - UnitWork.Add(processTransitionHistoryEntity); - } - - //if (!string.IsNullOrEmpty(dbbaseId) && !string.IsNullOrEmpty(sql))//Իִsql - //{ - // DataBaseLinkEntity dataBaseLinkEntity = dataBaseLinkService.GetEntity(dbbaseId);//ȡ - // this.BaseRepository(dataBaseLinkEntity.DbConnection).ExecuteBySql(sql.Replace("{0}", processInstanceEntity.Id)); - //} - UnitWork.Save(); - return 1; - } - catch - { - throw; - } - } - - #endregion - - + #region ̴API /// /// һʵ @@ -166,153 +88,142 @@ namespace OpenAuth.App /// /// ڵ /// - /// + /// /// - public bool NodeVerification(string processId, bool flag, string description = "") + public bool NodeVerification(string instanceId, bool flag, string description = "") { - bool _res = false; - try + FlowInstance flowInstance = Get(instanceId); + FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory();//¼ + FlowInstanceTransitionHistory processTransitionHistoryEntity = null;//ת¼ + + FlowRuntime wfruntime = new FlowRuntime(flowInstance); + + + #region ǩ + if (flowInstance.ActivityType == 0)//ǩ { - string _sqlstr = "", _dbbaseId = ""; - FlowInstance FlowInstance = Get(processId); - FlowInstanceOperationHistory FlowInstanceOperationHistory = new FlowInstanceOperationHistory();//¼ - FlowInstanceTransitionHistory processTransitionHistoryEntity = null;//ת¼ - - FlowRuntime wfruntime = new FlowRuntime(FlowInstance); - - - #region ǩ - if (FlowInstance.ActivityType == 0)//ǩ + wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 1, "");//ǵǰڵͨ + ///ѰҪ˵ĽڵId + string _VerificationNodeId = ""; + List _nodelist = wfruntime.GetCountersigningNodeIdList(wfruntime.runtimeModel.currentNodeId); + string _makerList = ""; + foreach (string item in _nodelist) { - wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 1, "");//ǵǰڵͨ - ///ѰҪ˵ĽڵId - string _VerificationNodeId = ""; - List _nodelist = wfruntime.GetCountersigningNodeIdList(wfruntime.runtimeModel.currentNodeId); - string _makerList = ""; - foreach (string item in _nodelist) + _makerList = GetMakerList(wfruntime.runtimeModel.nodes[item], wfruntime.runtimeModel.flowInstanceId); + if (_makerList != "-1") { - _makerList = GetMakerList(wfruntime.runtimeModel.nodes[item], wfruntime.runtimeModel.flowInstanceId); - if (_makerList != "-1") + var id = AuthUtil.GetCurrentUser().User.Id; + foreach (string one in _makerList.Split(',')) { - var id = AuthUtil.GetCurrentUser().User.Id; - foreach (string one in _makerList.Split(',')) + if (id == one || id.IndexOf(one) != -1) { - if (id == one || id.IndexOf(one) != -1) - { - _VerificationNodeId = item; - break; - } + _VerificationNodeId = item; + break; } } } - - if (_VerificationNodeId != "") - { - if (flag) - { - FlowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.nodes[_VerificationNodeId].name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; - } - else - { - FlowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.nodes[_VerificationNodeId].name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; - } - - string _Confluenceres = wfruntime.NodeConfluence(_VerificationNodeId, flag, AuthUtil.GetCurrentUser().User.Id, description); - var _data = new - { - SchemeContent = wfruntime.runtimeModel.schemeContentJson.ToString(), - wfruntime.runtimeModel.frmData - }; - switch (_Confluenceres) - { - case "-1"://ͨ - FlowInstance.IsFinish = 3; - break; - case "1"://ȴ - break; - default://ͨ - FlowInstance.PreviousId = FlowInstance.ActivityId; - FlowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId; - FlowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType;//-1޷,0ǩʼ,1ǩ,2һڵ,4н - FlowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name; - FlowInstance.IsFinish = (wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0); - FlowInstance.MakerList = (wfruntime.runtimeModel.nextNodeType == 4 ? "" : GetMakerList(wfruntime));//ǰڵִеϢ - - #region ת¼ - processTransitionHistoryEntity = new FlowInstanceTransitionHistory(); - processTransitionHistoryEntity.FromNodeId = wfruntime.runtimeModel.currentNodeId; - processTransitionHistoryEntity.FromNodeName = wfruntime.runtimeModel.currentNode.name; - processTransitionHistoryEntity.FromNodeType = wfruntime.runtimeModel.currentNodeType; - processTransitionHistoryEntity.ToNodeId = wfruntime.runtimeModel.nextNodeId; - processTransitionHistoryEntity.ToNodeName = wfruntime.runtimeModel.nextNode.name; - processTransitionHistoryEntity.ToNodeType = wfruntime.runtimeModel.nextNodeType; - processTransitionHistoryEntity.TransitionSate = 0; - processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); - #endregion - - break; - } - } - else - { - throw (new Exception("쳣,Ҳ˽ڵ")); - } } - #endregion - #region һ - else//һ + if (_VerificationNodeId != "") { if (flag) { - wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 1, AuthUtil.GetCurrentUser().User.Id, description); - FlowInstance.PreviousId = FlowInstance.ActivityId; - FlowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId; - FlowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType;//-1޷,0ǩʼ,1ǩ,2һڵ,4н - FlowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name; - FlowInstance.MakerList = wfruntime.runtimeModel.nextNodeType == 4 ? "" : GetMakerList(wfruntime);//ǰڵִеϢ - FlowInstance.IsFinish = (wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0); - #region ת¼ - - processTransitionHistoryEntity = new FlowInstanceTransitionHistory - { - FromNodeId = wfruntime.runtimeModel.currentNodeId, - FromNodeName = wfruntime.runtimeModel.currentNode.name, - FromNodeType = wfruntime.runtimeModel.currentNodeType, - ToNodeId = wfruntime.runtimeModel.nextNodeId, - ToNodeName = wfruntime.runtimeModel.nextNode.name, - ToNodeType = wfruntime.runtimeModel.nextNodeType, - TransitionSate = 0 - }; - processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); - #endregion - - - FlowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; + flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.nodes[_VerificationNodeId].name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; } else { - FlowInstance.IsFinish = 3; //ʾýڵ㲻ͬ - wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, -1, AuthUtil.GetUserName(), description); - - FlowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; + flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.nodes[_VerificationNodeId].name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; } - var data = new + + string _Confluenceres = wfruntime.NodeConfluence(_VerificationNodeId, flag, AuthUtil.GetCurrentUser().User.Id, description); + var _data = new { SchemeContent = wfruntime.runtimeModel.schemeContentJson.ToString(), wfruntime.runtimeModel.frmData }; - } - #endregion + switch (_Confluenceres) + { + case "-1"://ͨ + flowInstance.IsFinish = 3; + break; + case "1"://ȴ + break; + default://ͨ + flowInstance.PreviousId = flowInstance.ActivityId; + flowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId; + flowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType;//-1޷,0ǩʼ,1ǩ,2һڵ,4н + flowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name; + flowInstance.IsFinish = (wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0); + flowInstance.MakerList = (wfruntime.runtimeModel.nextNodeType == 4 ? "" : GetMakerList(wfruntime));//ǰڵִеϢ - _res = true; - SaveProcess(_sqlstr, _dbbaseId, FlowInstance, FlowInstanceOperationHistory, processTransitionHistoryEntity); - return _res; + #region ת¼ + processTransitionHistoryEntity = new FlowInstanceTransitionHistory(); + processTransitionHistoryEntity.FromNodeId = wfruntime.runtimeModel.currentNodeId; + processTransitionHistoryEntity.FromNodeName = wfruntime.runtimeModel.currentNode.name; + processTransitionHistoryEntity.FromNodeType = wfruntime.runtimeModel.currentNodeType; + processTransitionHistoryEntity.ToNodeId = wfruntime.runtimeModel.nextNodeId; + processTransitionHistoryEntity.ToNodeName = wfruntime.runtimeModel.nextNode.name; + processTransitionHistoryEntity.ToNodeType = wfruntime.runtimeModel.nextNodeType; + processTransitionHistoryEntity.TransitionSate = 0; + processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); + #endregion + + break; + } + } + else + { + throw (new Exception("쳣,Ҳ˽ڵ")); + } } - catch + #endregion + + #region һ + else//һ { - throw; + if (flag) + { + wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 1 + , AuthUtil.GetCurrentUser().User.Id, description); + flowInstance.PreviousId = flowInstance.ActivityId; + flowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId; + flowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType; + flowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name; + flowInstance.MakerList = wfruntime.runtimeModel.nextNodeType == 4 ? "" : GetMakerList(wfruntime);//ǰڵִеϢ + flowInstance.IsFinish = (wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0); + #region ת¼ + + processTransitionHistoryEntity = new FlowInstanceTransitionHistory + { + FromNodeId = wfruntime.runtimeModel.currentNodeId, + FromNodeName = wfruntime.runtimeModel.currentNode.name, + FromNodeType = wfruntime.runtimeModel.currentNodeType, + ToNodeId = wfruntime.runtimeModel.nextNodeId, + ToNodeName = wfruntime.runtimeModel.nextNode.name, + ToNodeType = wfruntime.runtimeModel.nextNodeType, + TransitionSate = 0 + }; + processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); + #endregion + + + flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; + } + else + { + flowInstance.IsFinish = 3; //ʾýڵ㲻ͬ + wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, -1, AuthUtil.GetUserName(), description); + + flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "ͬ,ע" + description; + } } + #endregion + + UnitWork.Update(flowInstance); + UnitWork.Add(flowInstanceOperationHistory); + UnitWork.Add(processTransitionHistoryEntity); + UnitWork.Save(); + return true; } /// /// @@ -323,59 +234,56 @@ namespace OpenAuth.App /// public bool NodeReject(string processId, string nodeId, string description = "") { - try + FlowInstance flowInstance = Get(processId); + FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory(); + FlowInstanceTransitionHistory processTransitionHistoryEntity = null; + + FlowRuntime wfruntime = new FlowRuntime(flowInstance); + + + string resnode = ""; + if (nodeId == "") { - FlowInstance flowInstance = Get(processId); - FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory(); - FlowInstanceTransitionHistory processTransitionHistoryEntity = null; - - FlowRuntime wfruntime = new FlowRuntime(flowInstance); - - - string resnode = ""; - if (nodeId == "") - { - resnode = wfruntime.RejectNode(); - } - else - { - resnode = nodeId; - } - wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 0, AuthUtil.GetUserName(), description); - flowInstance.IsFinish = 4;//4ʾأҪύ - if (resnode != "") - { - flowInstance.PreviousId = flowInstance.ActivityId; - flowInstance.ActivityId = resnode; - flowInstance.ActivityType = wfruntime.GetNodeType(resnode);//-1޷,0ǩʼ,1ǩ,2һڵ,4н - flowInstance.ActivityName = wfruntime.runtimeModel.nodes[resnode].name; - flowInstance.MakerList = GetMakerList(wfruntime.runtimeModel.nodes[resnode], flowInstance.PreviousId);//ǰڵִеϢ - #region ת¼ - processTransitionHistoryEntity = new FlowInstanceTransitionHistory(); - processTransitionHistoryEntity.FromNodeId = wfruntime.runtimeModel.currentNodeId; - processTransitionHistoryEntity.FromNodeName = wfruntime.runtimeModel.currentNode.name; - processTransitionHistoryEntity.FromNodeType = wfruntime.runtimeModel.currentNodeType; - processTransitionHistoryEntity.ToNodeId = wfruntime.runtimeModel.nextNodeId; - processTransitionHistoryEntity.ToNodeName = wfruntime.runtimeModel.nextNode.name; - processTransitionHistoryEntity.ToNodeType = wfruntime.runtimeModel.nextNodeType; - processTransitionHistoryEntity.TransitionSate = 1;// - processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); - #endregion - } - var data = new - { - SchemeContent = wfruntime.runtimeModel.schemeContentJson.ToString(), - frmData = (flowInstance.FrmType == 0 ? wfruntime.runtimeModel.frmData : null) - }; - flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + ",ע" + description; - - SaveProcess(flowInstance, flowInstanceOperationHistory, processTransitionHistoryEntity); - return true; + resnode = wfruntime.RejectNode(); } - catch + else { - throw; + resnode = nodeId; } + wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, 0, AuthUtil.GetUserName(), description); + flowInstance.IsFinish = 4;//4ʾأҪύ + if (resnode != "") + { + flowInstance.PreviousId = flowInstance.ActivityId; + flowInstance.ActivityId = resnode; + flowInstance.ActivityType = wfruntime.GetNodeType(resnode);//-1޷,0ǩʼ,1ǩ,2һڵ,4н + flowInstance.ActivityName = wfruntime.runtimeModel.nodes[resnode].name; + flowInstance.MakerList = GetMakerList(wfruntime.runtimeModel.nodes[resnode], flowInstance.PreviousId);//ǰڵִеϢ + #region ת¼ + processTransitionHistoryEntity = new FlowInstanceTransitionHistory(); + processTransitionHistoryEntity.FromNodeId = wfruntime.runtimeModel.currentNodeId; + processTransitionHistoryEntity.FromNodeName = wfruntime.runtimeModel.currentNode.name; + processTransitionHistoryEntity.FromNodeType = wfruntime.runtimeModel.currentNodeType; + processTransitionHistoryEntity.ToNodeId = wfruntime.runtimeModel.nextNodeId; + processTransitionHistoryEntity.ToNodeName = wfruntime.runtimeModel.nextNode.name; + processTransitionHistoryEntity.ToNodeType = wfruntime.runtimeModel.nextNodeType; + processTransitionHistoryEntity.TransitionSate = 1;// + processTransitionHistoryEntity.IsFinish = (processTransitionHistoryEntity.ToNodeType == 4 ? 1 : 0); + #endregion + } + var data = new + { + SchemeContent = wfruntime.runtimeModel.schemeContentJson.ToString(), + frmData = (flowInstance.FrmType == 0 ? wfruntime.runtimeModel.frmData : null) + }; + flowInstanceOperationHistory.Content = "" + "todo name" + "" + wfruntime.runtimeModel.currentNode.name + "" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + ",ע" + description; + + UnitWork.Add(flowInstance); + UnitWork.Add(flowInstanceOperationHistory); + UnitWork.Add(processTransitionHistoryEntity); + UnitWork.Save(); + + return true; } #endregion @@ -454,10 +362,10 @@ namespace OpenAuth.App //} //else if (node.setInfo.NodeDesignate.Value == "NodeDesignateType2")//ָԱ //{ - makerlsit = ArrayToString(node.setInfo.NodeDesignateData.role, makerlsit); + makerlsit = GenericHelpers.ArrayToString(node.setInfo.NodeDesignateData.role, makerlsit); // makerlsit = ArrwyToString(node.setInfo.NodeDesignateData.post, makerlsit); // makerlsit = ArrwyToString(node.setInfo.NodeDesignateData.usergroup, makerlsit); - makerlsit = ArrayToString(node.setInfo.NodeDesignateData.users, makerlsit); + makerlsit = GenericHelpers.ArrayToString(node.setInfo.NodeDesignateData.users, makerlsit); if (makerlsit == "") { @@ -531,68 +439,33 @@ namespace OpenAuth.App /// /// /// - private string ArrayToString(dynamic data, string Str) - { - string resStr = Str; - foreach (var item in data) - { - if (resStr != "") - { - resStr += ","; - } - - if (item is string) - { - resStr += item; - } - else - { - resStr += item.Value; - - } - } - return resStr; - } - - + /// /// /// 2017-01-20 15:44:45 /// - /// The process identifier. - /// The verification data. - public void VerificationProcess(string processId, string verificationData) + public void Verification(VerificationReq request) { - try + // + if (request.VerificationFinally == "3") { - dynamic verificationDataJson = verificationData.ToJson(); - - // - if (verificationDataJson.VerificationFinally.Value == "3") + string _nodeId = ""; + if (!string.IsNullOrEmpty(request.NodeRejectStep)) { - string _nodeId = ""; - if (verificationDataJson.NodeRejectStep != null) - { - _nodeId = verificationDataJson.NodeRejectStep.Value; - } - NodeReject(processId, _nodeId, verificationDataJson.VerificationOpinion.Value); - } - else if (verificationDataJson.VerificationFinally.Value == "2")//ʾͬ - { - NodeVerification(processId, false, verificationDataJson.VerificationOpinion.Value); - } - else if (verificationDataJson.VerificationFinally.Value == "1")//ʾͬ - { - NodeVerification(processId, true, verificationDataJson.VerificationOpinion.Value); + _nodeId = request.NodeRejectStep; } + NodeReject(request.FlowInstanceId, _nodeId, request.VerificationOpinion); } - catch + else if (request.VerificationFinally == "2")//ʾͬ { - throw; + NodeVerification(request.FlowInstanceId, false, request.VerificationOpinion); + } + else if (request.VerificationFinally == "1")//ʾͬ + { + NodeVerification(request.FlowInstanceId, true, request.VerificationOpinion); } } - public void Update(FlowInstance flowScheme) { Repository.Update(u => u.Id == flowScheme.Id, u => new FlowInstance()); diff --git a/OpenAuth.App/OpenAuth.App.csproj b/OpenAuth.App/OpenAuth.App.csproj index fcebeebf..22df6fa4 100644 --- a/OpenAuth.App/OpenAuth.App.csproj +++ b/OpenAuth.App/OpenAuth.App.csproj @@ -120,6 +120,7 @@ + diff --git a/OpenAuth.App/Request/VerificationReq.cs b/OpenAuth.App/Request/VerificationReq.cs new file mode 100644 index 00000000..e053b7a0 --- /dev/null +++ b/OpenAuth.App/Request/VerificationReq.cs @@ -0,0 +1,21 @@ +namespace OpenAuth.App.Request +{ + public class VerificationReq + { + public string FlowInstanceId { get; set; } + /// + /// 1:同意;2:不同意;3:驳回 + /// + public string VerificationFinally { get; set; } + + /// + /// 审核意见 + /// + public string VerificationOpinion { get; set; } + + /// + /// 驳回的步骤 + /// + public string NodeRejectStep { get; set; } + } +} diff --git a/OpenAuth.Mvc/Controllers/FlowInstancesController.cs b/OpenAuth.Mvc/Controllers/FlowInstancesController.cs index 8ca3df3f..cff18bc4 100644 --- a/OpenAuth.Mvc/Controllers/FlowInstancesController.cs +++ b/OpenAuth.Mvc/Controllers/FlowInstancesController.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using System.Web.Http; using System.Web.Mvc; using Infrastructure; using Newtonsoft.Json.Linq; @@ -27,6 +26,26 @@ namespace OpenAuth.Mvc.Controllers return View(); } + public ActionResult Verification() + { + return View(); + } + + [HttpPost] + public string Verification(VerificationReq request) + { + try + { + App.Verification(request); + + } + catch (Exception ex) + { + Result.Code = 500; + Result.Message = ex.Message; + } + return JsonHelper.Instance.Serialize(Result); + } public string Get(string id) { @@ -80,7 +99,7 @@ namespace OpenAuth.Mvc.Controllers /// /// 加载列表 /// - public string Load([FromUri]QueryFlowInstanceListReq request) + public string Load([System.Web.Http.FromUri]QueryFlowInstanceListReq request) { return JsonHelper.Instance.Serialize(App.Load(request)); } diff --git a/OpenAuth.Mvc/OpenAuth.Mvc.csproj b/OpenAuth.Mvc/OpenAuth.Mvc.csproj index 54540b1b..052e3a6b 100644 --- a/OpenAuth.Mvc/OpenAuth.Mvc.csproj +++ b/OpenAuth.Mvc/OpenAuth.Mvc.csproj @@ -195,6 +195,7 @@ + @@ -638,6 +639,7 @@ + diff --git a/OpenAuth.Mvc/Views/FlowInstances/Verification.cshtml b/OpenAuth.Mvc/Views/FlowInstances/Verification.cshtml new file mode 100644 index 00000000..aaed2e43 --- /dev/null +++ b/OpenAuth.Mvc/Views/FlowInstances/Verification.cshtml @@ -0,0 +1,52 @@ + +@section header +{ + + + +} + +
+
+
+
    +
  • 表单信息
  • +
  • 流程信息
  • +
+ +
+
+
+
+ +
+
+
+ +
+
+ + +
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ + +
+ + + diff --git a/OpenAuth.Mvc/userJs/flowInstanceOp.js b/OpenAuth.Mvc/userJs/flowInstanceOp.js new file mode 100644 index 00000000..4522b7ec --- /dev/null +++ b/OpenAuth.Mvc/userJs/flowInstanceOp.js @@ -0,0 +1,69 @@ +layui.config({ + base: "/js/" +}).use(['form', 'vue', 'ztree', 'layer', 'utils', 'element', 'jquery', 'droptree', 'openauth', 'flow/gooflow', 'flowlayout'], function () { + var form = layui.form, element = layui.element, + //layer = (parent == undefined || parent.layer === undefined )? layui.layer : parent.layer, + layer = layui.layer, + $ = layui.jquery; + var openauth = layui.openauth; + var index = parent.layer.getFrameIndex(window.name); //获取窗口索引 + + var vm = new Vue({ + el: "#formEdit" + }); + + var id = $.getUrlParam("id"); //ID + $("#FlowInstanceId").val(id); + + //标签切换 + element.on('tab(tab)', function (data) { + parent.layer.iframeAuto(index); + }); + + /*=========流程设计(begin)======================*/ + var flowDesignPanel = $('#flowPanel').flowdesign({ + height: 300, + widht: 300, + haveTool: false + }); + /*=========流程设计(end)=====================*/ + + $.getJSON('/FlowInstances/get?id=' + id, + function (data) { + var obj = data.Result; + flowDesignPanel.loadData(JSON.parse(obj.SchemeContent)); + + //取表单的结构数据 + $.getJSON("/forms/get?id=" + obj.FrmId, function (data) { + if (data.Code != 500) { + $("#frmPreview").html(data.Result.Html); + } + }); + }); + + //提交数据 + form.on('submit(formSubmit)', + function (data) { + $.post("/FlowInstances/Verification", + data.field, + function (result) { + layer.msg(result.Message); + }, + "json"); + + return false; //阻止表单跳转。 + }); + + //$(window).resize(function() { + // flowDesignPanel.reinitSize($(window).width()-30, $(window).height()-100); + //}); + + //该函数供给父窗口确定时调用 + submit = function () { + //只能用隐藏的submit btn才行,用form.submit()时data.field里没有数据 + $("#btnSubmit").click(); + } + + //让层自适应iframe + parent.layer.iframeAuto(index); +}) \ No newline at end of file diff --git a/OpenAuth.Mvc/userJs/flowInstances.js b/OpenAuth.Mvc/userJs/flowInstances.js index c718bbe5..d9fcbe7d 100644 --- a/OpenAuth.Mvc/userJs/flowInstances.js +++ b/OpenAuth.Mvc/userJs/flowInstances.js @@ -128,6 +128,32 @@ editDlg.update(data[0]); } + , btnVerification: function () { //处理 + var checkStatus = table.checkStatus('mainList') + , data = checkStatus.data; + if (data.length != 1) { + layer.msg("请选择要处理的流程,且同时只能选择一条"); + return; + } + + layer.open({ + type: 2, + area: ['600px', '500px'], //宽高 + maxmin: true, //开启最大化最小化按钮 + title: '处理流程', + content: '/flowInstances/Verification?id=' + data[0].Id, + btn: ['保存', '关闭'], + yes: function (index, layero) { + var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method(); + iframeWin.submit(); + }, + cancel: function (index) { + layer.close(index); + mainList(); + } + }); + } + , search: function () { //搜索 mainList({ key: $('#key').val() }); } diff --git a/OpenAuth.Repository/Domain/FlowInstance.cs b/OpenAuth.Repository/Domain/FlowInstance.cs index 8eddaa05..f26ae41e 100644 --- a/OpenAuth.Repository/Domain/FlowInstance.cs +++ b/OpenAuth.Repository/Domain/FlowInstance.cs @@ -62,7 +62,7 @@ namespace OpenAuth.Repository.Domain ///
public string ActivityId { get; set; } /// - /// 当前节点类型(0会签节点) + /// 当前节点类型 -1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束 /// public int? ActivityType { get; set; } /// @@ -130,7 +130,7 @@ namespace OpenAuth.Repository.Domain /// public string Description { get; set; } /// - /// 是否完成 + /// 是否完成 0未完成,1完成并同意,2被召回,3完成但不同意, 4被驳回需要重新提交 /// public int IsFinish { get; set; } /// diff --git a/数据库设计关系图/OpenAuthDB.pdm b/数据库设计关系图/OpenAuthDB.pdm index 4757b78b..bd69d01d 100644 --- a/数据库设计关系图/OpenAuthDB.pdm +++ b/数据库设计关系图/OpenAuthDB.pdm @@ -1,5 +1,5 @@ - + @@ -3967,7 +3967,7 @@ PhysOpts= [ModelOptions\Default Opts\FRMESOB<<WorkloadGroup>>] PhysOpts= -F:\MyProject\OpenAuth.Net\数据库设计关系图\OpenAuthDB.pdm +C:\MyProject\OpenAuth.Net\数据库设计关系图\OpenAuthDB.pdm 9401CEBA-B163-4ADB-AECF-03CE78C0FFF3 @@ -9029,9 +9029,9 @@ Drop=No ActivityType 1504793917 Administrator -1504798127 +1521866779 Administrator -当前节点类型(0会签节点) +当前节点类型-1无法运行,0会签开始,1会签结束,2一般节点,3开始节点,4流程运行结束 int @@ -9257,9 +9257,9 @@ Drop=No IsFinish 1504793917 Administrator -1520667807 +1521866723 Administrator -是否完成 +是否完成0运行中,1完成并同意,2被召回,3完成但不同意, 4被驳回需要重新提交 0 int 1